Diana Software
QMinimizer.cc
Go to the documentation of this file.
1 #include "QMinimizer.hh"
2 #include <gsl/gsl_errno.h>
3 #include <gsl/gsl_math.h>
4 
6 
8 
10 {
11  const gsl_min_fminimizer_type *T;
12  T = gsl_min_fminimizer_brent;
13  fMinimizer = gsl_min_fminimizer_alloc (T);
14  fVerbose = false;
15 }
16 
18 {
19 // gsl_min_fminimizer_free (fMinimizer);
20 }
21 
22 double QMinimizer::GetMinimum(QMathFunction func, double lowbound, double upbound, double epsabs, double epsrel)
23 {
24  double min = Q_DOUBLE_DEFAULT;
25  double startx = (upbound - lowbound)/2;
26  int status;
27  int iter = 0, max_iter = 100;
28  gsl_function F;
29  F = func.GetGSLFunction();
30 
31  gsl_min_fminimizer_set (fMinimizer, &F, startx, lowbound, upbound);
32 
33  if(fVerbose) {
34  printf ("%5d [%.7f, %.7f] "
35  "%.7f\n",
36  iter, lowbound, upbound,
37  startx);
38  }
39 
40  do
41  {
42  iter++;
43  status = gsl_min_fminimizer_iterate (fMinimizer);
44 
45  min = gsl_min_fminimizer_x_minimum (fMinimizer);
46  lowbound = gsl_min_fminimizer_x_lower (fMinimizer);
47  upbound = gsl_min_fminimizer_x_upper (fMinimizer);
48 
49  status = gsl_min_test_interval (lowbound,upbound, epsabs, epsrel);
50 
51  if(fVerbose) {
52  if (status == GSL_SUCCESS) printf ("Converged:\n");
53  printf ("%5d [%.7f, %.7f] "
54  "%.7f\n",
55  iter, lowbound, upbound,
56  min);
57  }
58  }
59  while (status == GSL_CONTINUE && iter < max_iter);
60 
61  if(status != GSL_SUCCESS) min = Q_DOUBLE_DEFAULT;
62 
63  return min;
64 }
65 double QMinimizer::MinusFunc(double x, double* params)
66 {
67  return - (*fCurrentFunction)(x,params);
68 }
69 
70 double QMinimizer::GetMaximum(QMathFunction func,double minx, double maxx, double epsabs, double epsrel)
71 {
73  QMathFunction minusFunc = func;
74  minusFunc.fRoutine = &(MinusFunc);
75  return GetMinimum(minusFunc,minx,maxx,epsabs,epsrel);
76 }
77 
#define Q_DOUBLE_DEFAULT
Definition: QDiana.hh:24
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
double min(const Diana::QVector &v)
Definition: QVector.cc:878
generic C++ interface on static functions
gsl_function GetGSLFunction()
return a gsl function
Definition: QMathFunction.cc:8
QRoutinePointer fRoutine
pointer to the underlying static function
double(* QRoutinePointer)(double, double *params)
pointer to function
double GetMaximum(QMathFunction func, double minx, double maxx, double epsabs=0.001, double epsrel=0.0)
get function maximum
Definition: QMinimizer.cc:70
~QMinimizer()
destructor
Definition: QMinimizer.cc:17
gsl_min_fminimizer * fMinimizer
underlying gsl minimizer
Definition: QMinimizer.hh:54
QMinimizer()
constructor
Definition: QMinimizer.cc:9
static double MinusFunc(double x, double *params)
pointer to mins this function, (to find maximum with the minimum algorithm)
Definition: QMinimizer.cc:65
bool fVerbose
verbose
Definition: QMinimizer.hh:56
double GetMinimum(QMathFunction func, double minx, double maxx, double epsabs=0.001, double epsrel=0.0)
get function minimum
Definition: QMinimizer.cc:22
static QMathFunction::QRoutinePointer fCurrentFunction
pointer to current function being minimized
Definition: QMinimizer.hh:49