Re: [ROOT] TMinuit

From: Edmond Offermann (edmondoffermann@yahoo.com)
Date: Wed Oct 15 2003 - 11:27:34 MEST


Hi,

Have a look at the Long Minuit writeup:

http://wwwasdoc.web.cern.ch/wwwasdoc/minuit/

in particular the comments around the "seek"
command.

My approach with a function like yours would
be to use "evolutionary strategy" like
simulated annealing to find the true minimum
and then use minuit to get error estimates,
contours etc.

Eddy
--- Rüdiger Berlich <ruediger.berlich@iwr.fzk.de>
wrote:
> 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