ROOT  6.06/09
Reference Guide
BrentMinimizer1D.cxx
Go to the documentation of this file.
1 // @(#)root/mathcore:$Id$
2 // Author: David Gonzalez Maline 2/2008
3  /**********************************************************************
4  * *
5  * Copyright (c) 2004 Maline, CERN/PH-SFT *
6  * *
7  * This library is free software; you can redistribute it and/or *
8  * modify it under the terms of the GNU General Public License *
9  * as published by the Free Software Foundation; either version 2 *
10  * of the License, or (at your option) any later version. *
11  * *
12  * This library is distributed in the hope that it will be useful, *
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
15  * General Public License for more details. *
16  * *
17  * You should have received a copy of the GNU General Public License *
18  * along with this library (see file COPYING); if not, write *
19  * to the Free Software Foundation, Inc., 59 Temple Place, Suite *
20  * 330, Boston, MA 02111-1307 USA, or contact the author. *
21  * *
22  **********************************************************************/
23 
24 // Header file for class BrentMinimizer1D
25 //
26 // Created by: Maline at Mon Feb 4 09:32:36 2008
27 //
28 //
29 
30 #include "Math/BrentMinimizer1D.h"
31 #include "Math/BrentMethods.h"
32 #include "Math/IFunction.h"
33 
34 #ifndef ROOT_Math_Error
35 #include "Math/Error.h"
36 #endif
37 
38 namespace ROOT {
39 namespace Math {
40 
41 static int gDefaultNpx = 100; // default nunmber of points used in the grid to bracked the minimum
42 static int gDefaultNSearch = 10; // nnumber of time the iteration (bracketing -Brent ) is repeted
43 
44 
46  fFunction(0),
47  fLogScan(false), fNIter(0),
48  fNpx(0), fStatus(-1),
49  fXMin(0), fXMax(0), fXMinimum(0)
50 {
51 // Default Constructor.
52  fNpx = gDefaultNpx;
53 }
54 
55 void BrentMinimizer1D::SetDefaultNpx(int n) { gDefaultNpx = n; }
56 
57 void BrentMinimizer1D::SetDefaultNSearch(int n) { gDefaultNSearch = n; }
58 
59 
60 void BrentMinimizer1D::SetFunction(const ROOT::Math::IGenFunction& f, double xlow, double xup)
61 {
62 // Sets function to be minimized.
63 
64  fFunction = &f;
65  fStatus = -1; // reset the status
66 
67  if (xlow >= xup)
68  {
69  double tmp = xlow;
70  xlow = xup;
71  xup = tmp;
72  }
73  fXMin = xlow;
74  fXMax = xup;
75 }
76 
77 
78 
80 { return (*fFunction)(fXMinimum); }
81 
83 { return (*fFunction)(fXMin); }
84 
86 { return (*fFunction)(fXMax); }
87 
88 bool BrentMinimizer1D::Minimize( int maxIter, double absTol , double relTol)
89 {
90 // Find minimum position iterating until convergence specified by the
91 // absolute and relative tolerance or the maximum number of iteration
92 // is reached.
93 // repet search (Bracketing + Brent) until max number of search is reached (default is 10)
94 // maxITer refers to the iterations inside the Brent algorithm
95 
96  if (!fFunction) {
97  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "Function has not been set");
98  return false;
99  }
100 
101  if (fLogScan && fXMin <= 0) {
102  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "xmin is < 0 and log scan is set - disable it");
103  fLogScan = false;
104  }
105 
106  fNIter = 0;
107  fStatus = -1;
108 
109  double xmin = fXMin;
110  double xmax = fXMax;
111 
112  int maxIter1 = gDefaultNSearch; // external loop (number of search )
113  int maxIter2 = maxIter; // internal loop inside the Brent algorithm
114 
115  int niter1 = 0;
116  int niter2 = 0;
117  bool ok = false;
118  while (!ok){
119  if (niter1 > maxIter1){
120  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "Search didn't converge");
121  fStatus = -2;
122  return false;
123  }
124  double x = BrentMethods::MinimStep(fFunction, 0, xmin, xmax, 0, fNpx,fLogScan);
125  x = BrentMethods::MinimBrent(fFunction, 0, xmin, xmax, x, 0, ok, niter2, absTol, relTol, maxIter2 );
126  fNIter += niter2; // count the total number of iterations
127  niter1++;
128  fXMinimum = x;
129  }
130 
131  fStatus = 0;
132  return true;
133 }
134 
135 
136 const char * BrentMinimizer1D::Name() const
137 { return "BrentMinimizer1D"; }
138 
139 } // Namespace Math
140 
141 } // Namespace ROOT
float xmin
Definition: THbookFile.cxx:93
Interface (abstract class) for generic functions objects of one-dimension Provides a method to evalua...
Definition: IFunction.h:133
const double absTol
Namespace for new ROOT classes and functions.
Definition: ROOT.py:1
double MinimStep(const IGenFunction *f, int type, double &xmin, double &xmax, double fy, int npx=100, bool useLog=false)
Grid search implementation, used to bracket the minimum and later use Brent's method with the bracket...
virtual double FValUpper() const
Return function value at current upper bound of the minimization interval.
double MinimBrent(const IGenFunction *f, int type, double &xmin, double &xmax, double xmiddle, double fy, bool &ok, int &niter, double epsabs=1.E-8, double epsrel=1.E-10, int maxiter=100)
Finds a minimum of a function, if the function is unimodal between xmin and xmax This method uses a c...
static int gDefaultNSearch
static void SetDefaultNSearch(int n)
set number of times the bracketing search in combination with is done to find a good interval Default...
ClassImp(TIterator) Bool_t TIterator return false
Compare two iterator objects.
Definition: TIterator.cxx:20
const IGenFunction * fFunction
Double_t x[n]
Definition: legend1.C:17
#define MATH_ERROR_MSG(loc, str)
Definition: Error.h:50
virtual double FValLower() const
Return function value at current lower bound of the minimization interval.
virtual const char * Name() const
Return name of minimization algorithm ("BrentMinimizer1D")
static int gDefaultNpx
void SetFunction(const ROOT::Math::IGenFunction &f, double xlow, double xup)
Sets function to be minimized.
float xmax
Definition: THbookFile.cxx:93
double f(double x)
Interface class for numerical methods for one-dimensional minimization.
Definition: IMinimizer1D.h:50
Namespace for new Math classes and functions.
static void SetDefaultNpx(int npx)
set number of default Npx used at construction time (when SetNpx is not called) Default value is 100 ...
virtual double FValMinimum() const
Return function value at current estimate of the minimum.
virtual bool Minimize(int maxIter, double absTol=1.E-8, double relTol=1.E-10)
Find minimum position iterating until convergence specified by the absolute and relative tolerance or...
BrentMinimizer1D()
Default Constructor.
const Int_t n
Definition: legend1.C:16