40 #include "gsl/gsl_min.h"
41 #include "gsl/gsl_errno.h"
51 GSLMinimizer1D::GSLMinimizer1D(Minim1D::Type type) :
52 fXmin(0), fXlow(0), fXup(0), fMin(0), fLow(0), fUp(0),
53 fIter(0), fStatus(-1), fIsSet(false),
54 fMinimizer(0), fFunction(0)
58 const gsl_min_fminimizer_type* T = 0 ;
61 case Minim1D::kGOLDENSECTION :
62 T = gsl_min_fminimizer_goldensection;
64 case Minim1D::kBRENT :
65 T = gsl_min_fminimizer_brent;
69 T = gsl_min_fminimizer_brent;
73 fMinimizer =
new GSL1DMinimizerWrapper(T);
74 fFunction =
new GSLFunctionWrapper();
78 GSLMinimizer1D::~GSLMinimizer1D()
82 if (fMinimizer)
delete fMinimizer;
83 if (fFunction)
delete fFunction;
86 GSLMinimizer1D::GSLMinimizer1D(
const GSLMinimizer1D &): IMinimizer1D()
91 GSLMinimizer1D & GSLMinimizer1D::operator = (
const GSLMinimizer1D &rhs)
94 if (
this == &rhs)
return *
this;
98 void GSLMinimizer1D::SetFunction( GSLFuncPointer f,
void * p,
double xmin,
double xlow,
double xup) {
105 fFunction->SetFuncPointer( f );
106 fFunction->SetParams( p );
109 std::cout <<
" [ "<< xlow <<
" , " << xup <<
" ]" << std::endl;
112 int status = gsl_min_fminimizer_set( fMinimizer->Get(), fFunction->GetFunc(), xmin, xlow, xup);
113 if (status != GSL_SUCCESS)
114 std::cerr <<
"GSLMinimizer1D: Error: Interval [ "<< xlow <<
" , " << xup <<
" ] does not contain a minimum" << std::endl;
122 int GSLMinimizer1D::Iterate() {
125 std::cerr <<
"GSLMinimizer1D- Error: Function has not been set in Minimizer" << std::endl;
129 int status = gsl_min_fminimizer_iterate(fMinimizer->Get());
131 fXmin = gsl_min_fminimizer_x_minimum(fMinimizer->Get() );
132 fMin = gsl_min_fminimizer_f_minimum(fMinimizer->Get() );
134 fXlow = gsl_min_fminimizer_x_lower(fMinimizer->Get() );
135 fXup = gsl_min_fminimizer_x_upper(fMinimizer->Get() );
136 fLow = gsl_min_fminimizer_f_lower(fMinimizer->Get() );
137 fUp = gsl_min_fminimizer_f_upper(fMinimizer->Get() );
141 double GSLMinimizer1D::XMinimum()
const {
146 double GSLMinimizer1D::XLower()
const {
151 double GSLMinimizer1D::XUpper()
const {
156 double GSLMinimizer1D::FValMinimum()
const {
161 double GSLMinimizer1D::FValLower()
const {
166 double GSLMinimizer1D::FValUpper()
const {
171 const char * GSLMinimizer1D::Name()
const {
173 return gsl_min_fminimizer_name(fMinimizer->Get() );
176 bool GSLMinimizer1D::Minimize (
int maxIter,
double absTol,
double relTol)
185 if (status != GSL_SUCCESS) {
186 MATH_ERROR_MSG(
"GSLMinimizer1D::Minimize",
"error returned when performing an iteration");
192 std::cout <<
"Min1D - iteration " << iter <<
" interval : [ " << fXlow <<
" , " << fXup <<
" ] min = " << fXmin
193 <<
" fmin " << fMin <<
" f(a) " << fLow <<
" f(b) " << fUp << std::endl;
197 status = TestInterval(fXlow, fXup, absTol, relTol);
198 if (status == GSL_SUCCESS) {
204 while (status == GSL_CONTINUE && iter < maxIter);
205 if (status == GSL_CONTINUE) {
206 double tol = std::abs(fXup-fXlow);
207 MATH_INFO_MSGVAL(
"GSLMinimizer1D::Minimize",
"exceeded max iterations, reached tolerance is not sufficient",tol);
214 int GSLMinimizer1D::TestInterval(
double xlow,
double xup,
double epsAbs,
double epsRel) {
216 return gsl_min_test_interval(xlow, xup, epsAbs, epsRel);