23 double RosenBrock(
const double *xx )
25 const Double_t x = xx[0];
26 const Double_t y = xx[1];
27 const Double_t tmp1 = y-x*x;
28 const Double_t tmp2 = 1-x;
29 return 100*tmp1*tmp1+tmp2*tmp2;
32 int NumericalMinimization(
const char * minName =
"Minuit2",
33 const char *algoName =
"" ,
48 ROOT::Math::Minimizer* minimum =
49 ROOT::Math::Factory::CreateMinimizer(minName, algoName);
52 minimum->SetMaxFunctionCalls(1000000);
53 minimum->SetMaxIterations(10000);
54 minimum->SetTolerance(0.001);
55 minimum->SetPrintLevel(1);
59 ROOT::Math::Functor f(&RosenBrock,2);
60 double step[2] = {0.01,0.01};
63 double variable[2] = { -1.,1.2};
64 if (randomSeed >= 0) {
65 TRandom2 r(randomSeed);
66 variable[0] = r.Uniform(-20,20);
67 variable[1] = r.Uniform(-20,20);
70 minimum->SetFunction(f);
73 minimum->SetVariable(0,
"x",variable[0], step[0]);
74 minimum->SetVariable(1,
"y",variable[1], step[1]);
79 const double *xs = minimum->X();
80 std::cout <<
"Minimum: f(" << xs[0] <<
"," << xs[1] <<
"): "
81 << minimum->MinValue() << std::endl;
84 if ( minimum->MinValue() < 1.E-4 && f(xs) < 1.E-4)
85 std::cout <<
"Minimizer " << minName <<
" - " << algoName
86 <<
" converged to the right minimum" << std::endl;
88 std::cout <<
"Minimizer " << minName <<
" - " << algoName
89 <<
" failed to converge !!!" << std::endl;
90 Error(
"NumericalMinimization",
"fail to converge");