#include "Math/Minimizer.h" #include "Math/Factory.h" #include "Math/Functor.h" #include "TString.h" #include using namespace std; double data[18]={725,725,727,728,731,733, 723,724,727,729,730,734, 80,210,360,540,720,900}; class MyFunc{ public: MyFunc(int id,int num) : my_id(id),my_num(num) {;} double Eval(const double *x); private: int my_id,my_num; }; double MyFunc::Eval(const double *x) { double ss=0; for(int i=0; i<6; i++){ ss+=pow(data[i]-(x[0]*data[i+12]+x[1]),2)+ pow(data[i+6]-(x[2]*data[i+12]+x[3]),2); } return ss; } void fitdata(TString fitter="GSLSimAn") { MyFunc F(0,1); ROOT::Math::Minimizer *min = ROOT::Math::Factory::CreateMinimizer(fitter.Data()); ROOT::Math::Functor f(&F,&MyFunc::Eval,4); min->SetFunction(f); min->SetVariable(0,"kx",1,0.01); min->SetVariable(1,"mx",740,1); min->SetVariable(2,"ky",-1,0.01); min->SetVariable(3,"my",770,1); min->SetMaxFunctionCalls(100000000); min->SetMaxIterations(10000000); min->SetTolerance(0.001); min->SetPrintLevel(0); min->Minimize(); const double *xs = min->X(); std::cout << xs[0] << " " << xs[1] << " " << xs[2] << " " << xs[3] << "\n"; std::cout << min->MinValue() << "\n"; delete min; }