uzair90
October 29, 2020, 8:50am
#1
Hello,

I am trying to pass a 3-D function with parameters to the minimizer. I define my 3D function like:

```
double MinimizeXYZROOT(double *xx, double *params){
const Double_t x = xx[0];
const Double_t y = xx[1];
const Double_t z = xx[2];
double *p = (double *)params;
.............
.............
return value;
}
```

This is the way I am trying to do the minimisation right now:

```
..................................
.................................
TF3 *f3=new TF3("",MinimizeXYZROOT,-500,500,-500,500,0.00001,1000);
ROOT::Math::WrappedTF3 f(f3);
for(int ipar=0;ipar<iEnt;ipar++){
f3->SetParameter(ipar,ParArray[ipar]);
}
minimum->SetFunction(f);
.........................
.........................
```

Can someone please guide me on how to pass a 3D function with parameters to the minimizer?

Thanks,
Uzair

ROOT Version: 6.20/04
Platform: Ubuntu 20.04.1
Compiler: 9.3.0

moneta
October 29, 2020, 9:43am
#2
Hi,

I presume you want to minimize `f(x,y,z|p)`

given the parameters `p`

and not finding the best values of the paramters `p`

, given some `x,y,z`

values.

In that case, you have two possibilities:

Create a TF3 class and then call TF3::GetMinimumXYZ(), see
https://root.cern.ch/doc/v608/classTF3.html#a663ab974987bd018a8a51976cc778ade
In this case Minuit is used by default but you can change the Minimizer by calling before,
`ROOT::Math::MinimizerOptions::SetDefaultMinimizer( minimizerName)`

Possible choices for minimizerName are:

```
- Minuit, Minuit2, GSLMultiMin, GSLSimAn, Genetic
```

The correct way to create a TF3 is also

```
TF3 *f3=new TF3("",MinimizeXYZROOT,-500,500,-500,500,0.00001,1000, npar);
```

where `npar`

is the number of function parameters

You use directly the MInimizer interface as shown in this tutorial:
https://root.cern/doc/master/NumericalMinimization_8C.html

In this case, it is still convenient to create a `TF3`

and then you pass the TF3 to the minimizer, by
wrapping using the `ROOT::Math::WrappedMultiTF1’ class. For example doing:

```
TF3 *f3=new TF3("",MinimizeXYZROOT,-500,500,-500,500,0.00001,1000, npar);
f3->SetParameters(......)
ROOT::Math::WrappedMultiTF1 f(*f3);
ROOT::Math::Minimizer* minimum = ROOT::Math::Factory::CreateMinimizer(minName, algoName);
minimum->SetFunction(f);
// use same code as tutorial (set variables passing initial values and step sizes)
minimum->SetVariable(0,"x",variable[0], step[0]);
minimum->SetVariable(1,"y",variable[1], step[1]);
minimum->SetVariable(2,"z",variable[2], step[2]);
// minimize function
minimum->Minimize();
```

Cheers

Lorenzo

uzair90
October 29, 2020, 1:28pm
#3
Thank you Lorenzo! The first case worked perfectly. Regarding the second case I am having a problem. When I say:

ROOT::Math::WrappedMultiTF1 f(f3);

Root says that it is not defined and there is no such class. Can you please guide me here?

Thanks,
Uzair

moneta
October 29, 2020, 1:43pm
#4
Hi

Sorry , there was an error in my code (I have updated now). The line should be:

```
ROOT::Math::WrappedMultiTF1 f(*f3);
```

Actually `ROOT::Math::WrappedMultiTF1`

is a typedef to `ROOT::Math::WrappedMultiTF1Templ<double>`

, but it should be recognized by ROOT and work fine

Lorenzo

system
closed
November 12, 2020, 1:43pm
#5
This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.