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
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.