Dear all, I'm trying to compare TMinuit's ability to minimize a function with Evolutionary Strategies. I'm using a modified version of the Ifit.C example of ROOT's tutorial section. I have "designed" a function that, for a gradient descent, should be very difficult to deal with due to the large number of local minima, whose number increases with increasing distance from 0 : (cos(x^2+y^2) + 2)*(x^2+y^2) This is a parabola-shaped "wave" symmetric around (0,0), whose amplitude and frequency increases with increasing distance from 0 (there are concentric "valleys" around 0). Starting at (100,100), Evolutionary Strategies find the minimum at (0,0) without problems. TMinuit, with the program listed below yields the following result : FCN=20002.5 FROM MIGRAD STATUS=CONVERGED 40 CALLS 41 TOTAL EDM=3.39986e-10 STRATEGY= 1 ERROR MATRIX ACCURATE EXT PARAMETER STEP FIRST NO. NAME VALUE ERROR SIZE DERIVATIVE 1 a1 1.00012e+02 5.38438e-03 4.76897e-05 -5.21611e-01 2 a2 1.00000e+02 5.38504e-03 4.76838e-05 -5.21555e-01 So basically TMinuit returns the starting value and seems to have got stuck in the very first minumum it found. I've also tried "MINIMIZE" (i.e MIGRAD + SIMPLEX -- no success) and SEEK (somewhat better results, but still not good). Is there anything I'm doing wrong here ? Thanks for your help, Ruediger Berlich /********************************************************************/ #include "TMinuit.h" void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag) { Double_t square = (par[0]*par[0] + par[1]*par[1]); f = (cos(square)+2.)*square; } void compfunc2() { TMinuit *gMinuit = new TMinuit(2); 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] = {100., 100.}; static Double_t step[2] = {4., 4.}; gMinuit->mnparm(0, "a1", vstart[0], step[0], 0,0,ierflg); gMinuit->mnparm(1, "a2", vstart[1], step[1], 0,0,ierflg); arglist[0] = 500; arglist[1] = 0.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); } /*************************************************************************/
This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET