## From \$ROOTSYS/tutorials/fit/NumericalMinimization.C

```// Example on how to use the new Minimizer class in ROOT
//  Show usage with all the possible minimizers.
// Minimize the Rosenbrock function (a 2D -function)
// This example is described also in
// http://root.cern.ch/drupal/content/numerical-minimization#multidim_minim
// input : minimizer name + algorithm name
// randomSeed: = <0 : fixed value: 0 random with seed 0; >0 random with given seed
//
//Author: L. Moneta Dec 2010

#include "Math/Minimizer.h"
#include "Math/Factory.h"
#include "Math/Functor.h"
#include "TRandom2.h"
#include "TError.h"
#include <iostream>

double RosenBrock(const double *xx )
{
const Double_t x = xx[0];
const Double_t y = xx[1];
const Double_t tmp1 = y-x*x;
const Double_t tmp2 = 1-x;
return 100*tmp1*tmp1+tmp2*tmp2;
}

int NumericalMinimization(const char * minName = "Minuit2",
const char *algoName = "" ,
int randomSeed = -1)
{
// create minimizer giving a name and a name (optionally) for the specific
// algorithm
// possible choices are:
//     minName                  algoName
//  Minuit2                     Fumili2
//  Fumili
//  GSLMultiMin                ConjugateFR, ConjugatePR, BFGS,
//                              BFGS2, SteepestDescent
//  GSLMultiFit
//   GSLSimAn
//   Genetic
ROOT::Math::Minimizer* min =
ROOT::Math::Factory::CreateMinimizer(minName, algoName);

// set tolerance , etc...
min->SetMaxFunctionCalls(1000000); // for Minuit/Minuit2
min->SetMaxIterations(10000);  // for GSL
min->SetTolerance(0.001);
min->SetPrintLevel(1);

// create funciton wrapper for minmizer
// a IMultiGenFunction type
ROOT::Math::Functor f(&RosenBrock,2);
double step[2] = {0.01,0.01};
// starting point

double variable[2] = { -1.,1.2};
if (randomSeed >= 0) {
TRandom2 r(randomSeed);
variable[0] = r.Uniform(-20,20);
variable[1] = r.Uniform(-20,20);
}

min->SetFunction(f);

// Set the free variables to be minimized!
min->SetVariable(0,"x",variable[0], step[0]);
min->SetVariable(1,"y",variable[1], step[1]);

// do the minimization
min->Minimize();

const double *xs = min->X();
std::cout << "Minimum: f(" << xs[0] << "," << xs[1] << "): "
<< min->MinValue()  << std::endl;

// expected minimum is 0
if ( min->MinValue()  < 1.E-4  && f(xs) < 1.E-4)
std::cout << "Minimizer " << minName << " - " << algoName
<< "   converged to the right minimum" << std::endl;
else {
std::cout << "Minimizer " << minName << " - " << algoName
<< "   failed to converge !!!" << std::endl;
Error("NumericalMinimization","fail to converge");
}

return 0;
}
```
NumericalMinimization.C:1
NumericalMinimization.C:2
NumericalMinimization.C:3
NumericalMinimization.C:4
NumericalMinimization.C:5
NumericalMinimization.C:6
NumericalMinimization.C:7
NumericalMinimization.C:8
NumericalMinimization.C:9
NumericalMinimization.C:10
NumericalMinimization.C:11
NumericalMinimization.C:12
NumericalMinimization.C:13
NumericalMinimization.C:14
NumericalMinimization.C:15
NumericalMinimization.C:16
NumericalMinimization.C:17
NumericalMinimization.C:18
NumericalMinimization.C:19
NumericalMinimization.C:20
NumericalMinimization.C:21
NumericalMinimization.C:22
NumericalMinimization.C:23
NumericalMinimization.C:24
NumericalMinimization.C:25
NumericalMinimization.C:26
NumericalMinimization.C:27
NumericalMinimization.C:28
NumericalMinimization.C:29
NumericalMinimization.C:30
NumericalMinimization.C:31
NumericalMinimization.C:32
NumericalMinimization.C:33
NumericalMinimization.C:34
NumericalMinimization.C:35
NumericalMinimization.C:36
NumericalMinimization.C:37
NumericalMinimization.C:38
NumericalMinimization.C:39
NumericalMinimization.C:40
NumericalMinimization.C:41
NumericalMinimization.C:42
NumericalMinimization.C:43
NumericalMinimization.C:44
NumericalMinimization.C:45
NumericalMinimization.C:46
NumericalMinimization.C:47
NumericalMinimization.C:48
NumericalMinimization.C:49
NumericalMinimization.C:50
NumericalMinimization.C:51
NumericalMinimization.C:52
NumericalMinimization.C:53
NumericalMinimization.C:54
NumericalMinimization.C:55
NumericalMinimization.C:56
NumericalMinimization.C:57
NumericalMinimization.C:58
NumericalMinimization.C:59
NumericalMinimization.C:60
NumericalMinimization.C:61
NumericalMinimization.C:62
NumericalMinimization.C:63
NumericalMinimization.C:64
NumericalMinimization.C:65
NumericalMinimization.C:66
NumericalMinimization.C:67
NumericalMinimization.C:68
NumericalMinimization.C:69
NumericalMinimization.C:70
NumericalMinimization.C:71
NumericalMinimization.C:72
NumericalMinimization.C:73
NumericalMinimization.C:74
NumericalMinimization.C:75
NumericalMinimization.C:76
NumericalMinimization.C:77
NumericalMinimization.C:78
NumericalMinimization.C:79
NumericalMinimization.C:80
NumericalMinimization.C:81
NumericalMinimization.C:82
NumericalMinimization.C:83
NumericalMinimization.C:84
NumericalMinimization.C:85
NumericalMinimization.C:86
NumericalMinimization.C:87
NumericalMinimization.C:88
NumericalMinimization.C:89
NumericalMinimization.C:90