#include "iostream" #include "TGraphErrors.h" #include "TH1.h" #include "TF1.h" #include "TLegend.h" #include "TCanvas.h" #include "TMinuit.h" const Int_t n = 5; const Float_t y[n] = {-4.017, -2.742, -1.1478, 1.491, 6.873}; const Float_t x[n] = {22000, 22930, 23880, 25130, 26390}; const Float_t ex[n] = {440, 470, 500, 530, 540}; const Float_t ey[n] = {0.5, 0.25, 0.08, 0.09, 1.9}; Float_t a1ForEffVar; Float_t a2ForEffVar; void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) { f = chisquare(par[0], par[1]); } double chisquare(Double_t alpha1, Double_t alpha2) { Double_t chisq = 0.; for (int i = 0; i < n; i++) { chisq += 1/aproxEffVariance(i)*pow(y[i]-alpha1*x[i]-alpha2/x[i],2); } return chisq; } double aproxEffVariance(Int_t i) { return pow(-a1ForEffVar+a2ForEffVar/pow(x[i],2),2)*pow(ex[i],2)+pow(ey[i],2); } void simpleEx() { a1ForEffVar = 0; a2ForEffVar = 0; for (int itNbr = 0; itNbr < 8; itNbr++) { //MINIMIZING Chi2 Using MINUIT TMinuit *gMinuit = new TMinuit(5); gMinuit->SetFCN(fcn); Double_t arglist[10]; Int_t ierflg = 0; arglist[0] = 1; gMinuit->mnexcm("SET ERR", arglist ,1,ierflg); static Double_t vstart[2] = {0.00098993, -589322}; static Double_t step[2] = {0.0000001 , 22803.5}; gMinuit->mnparm(0, "alpha1", vstart[0], step[0], 0, 0, ierflg); gMinuit->mnparm(1, "alpha2", vstart[1], step[1], 0, 0, ierflg); arglist[0] = 500; arglist[1] = 1.; gMinuit->mnexcm("MIGRAD", arglist, 2, ierflg); Double_t amin,edm,errdef; Int_t nvpar,nparx,icstat; gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat); gMinuit->mnprin(3,amin); //Try to get the result (alpha1 and alpha2) from minuit Double_t params[6]; gMinuit->GetParameters(¶ms[3]); // <--- Gives: Error: Can't call TMinuit::GetParameters(¶ms[3]) cout<<"params[0] "<