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