Logo ROOT   6.08/07
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 #include "Math/IFunctionfwd.h"
34 
35 #ifndef ROOT_Math_Error
36 #include "Math/Error.h"
37 #endif
38 
39 namespace ROOT {
40 namespace Math {
41 
42 static int gDefaultNpx = 100; // default nunmber of points used in the grid to bracked the minimum
43 static int gDefaultNSearch = 10; // nnumber of time the iteration (bracketing -Brent ) is repeted
44 
45 
47  fFunction(0),
48  fLogScan(false), fNIter(0),
49  fNpx(0), fStatus(-1),
50  fXMin(0), fXMax(0), fXMinimum(0)
51 {
52 // Default Constructor.
53  fNpx = gDefaultNpx;
54 }
55 
56 void BrentMinimizer1D::SetDefaultNpx(int n) { gDefaultNpx = n; }
57 
58 void BrentMinimizer1D::SetDefaultNSearch(int n) { gDefaultNSearch = n; }
59 
60 
61 void BrentMinimizer1D::SetFunction(const ROOT::Math::IGenFunction& f, double xlow, double xup)
62 {
63 // Sets function to be minimized.
64 
65  fFunction = &f;
66  fStatus = -1; // reset the status
67 
68  if (xlow >= xup)
69  {
70  double tmp = xlow;
71  xlow = xup;
72  xup = tmp;
73  }
74  fXMin = xlow;
75  fXMax = xup;
76 }
77 
78 
79 
81 { return (*fFunction)(fXMinimum); }
82 
84 { return (*fFunction)(fXMin); }
85 
87 { return (*fFunction)(fXMax); }
88 
89 bool BrentMinimizer1D::Minimize( int maxIter, double absTol , double relTol)
90 {
91 // Find minimum position iterating until convergence specified by the
92 // absolute and relative tolerance or the maximum number of iteration
93 // is reached.
94 // repet search (Bracketing + Brent) until max number of search is reached (default is 10)
95 // maxITer refers to the iterations inside the Brent algorithm
96 
97  if (!fFunction) {
98  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "Function has not been set");
99  return false;
100  }
101 
102  if (fLogScan && fXMin <= 0) {
103  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "xmin is < 0 and log scan is set - disable it");
104  fLogScan = false;
105  }
106 
107  fNIter = 0;
108  fStatus = -1;
109 
110  double xmin = fXMin;
111  double xmax = fXMax;
112 
113  int maxIter1 = gDefaultNSearch; // external loop (number of search )
114  int maxIter2 = maxIter; // internal loop inside the Brent algorithm
115 
116  int niter1 = 0;
117  int niter2 = 0;
118  bool ok = false;
119  while (!ok){
120  if (niter1 > maxIter1){
121  MATH_ERROR_MSG("BrentMinimizer1D::Minimize", "Search didn't converge");
122  fStatus = -2;
123  return false;
124  }
125  double x = BrentMethods::MinimStep(fFunction, 0, xmin, xmax, 0, fNpx,fLogScan);
126  x = BrentMethods::MinimBrent(fFunction, 0, xmin, xmax, x, 0, ok, niter2, absTol, relTol, maxIter2 );
127  fNIter += niter2; // count the total number of iterations
128  niter1++;
129  fXMinimum = x;
130  }
131 
132  fStatus = 0;
133  return true;
134 }
135 
136 
137 const char * BrentMinimizer1D::Name() const
138 { return "BrentMinimizer1D"; }
139 
140 } // Namespace Math
141 
142 } // 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
This namespace contains pre-defined functions to be used in conjuction with TExecutor::Map and TExecu...
Definition: StringConv.hxx:21
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&#39;s method with the bracket...
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...
const IGenFunction * fFunction
Double_t x[n]
Definition: legend1.C:17
#define MATH_ERROR_MSG(loc, str)
Definition: Error.h:50
virtual double FValUpper() const
Return function value at current upper bound of the minimization interval.
virtual double FValLower() const
Return function value at current lower bound of the minimization interval.
static int gDefaultNpx
virtual const char * Name() const
Return name of minimization algorithm ("BrentMinimizer1D")
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)
virtual double FValMinimum() const
Return function value at current estimate of the minimum.
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 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