[ROOT] TMinuit

From: Rüdiger Berlich (ruediger.berlich@iwr.fzk.de)
Date: Tue Oct 14 2003 - 23:09:31 MEST


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