again fitting

Pasha Murat (murat@cdfsga.fnal.gov)
Fri, 12 Sep 1997 21:51:41 GMT


Hi Wolfgang,

just do:

root [0] .L a1.c
root [1] lfit()

(I guess you tried to execute your macro instead - .x a1.c ...)

Pasha.

P.S. It would be nice if postings like the one below contain not only
a bunch of code, but the commands you issued as well. It makes much
more easy to figure out what is going wrong.
--------------------------------------------------------------------------------

Wolfgang Korsch writes:
> Hi again,
> I still have problems with the fitiing:
>
> Here is my code:
>
>
> {
>
> Float_t z[5],x[5],y[5],errorz[5];
>
> void lfit()
> {
> //the z values
> z[0]=1;
> z[1]=0.96;
> z[2]=0.89;
> z[3]=0.85;
> z[4]=0.78;
> // The errors on z values
> Float_t error = 0.01;
> errorz[0]=error;
> errorz[1]=error;
> errorz[2]=error;
> errorz[3]=error;
> errorz[4]=error;
> // the x values
> x[0]=1.5751;
> x[1]=1.5825;
> x[2]=1.6069;
> x[3]=1.6339;
> x[4]=1.6706;
> // the y values
> y[0]=1.0642;
> y[1]=0.97685;
> y[2]=1.13168;
> y[3]=1.128654;
> y[4]=1.44016;
>
> TMinuit *gMinuit = new TMinuit(5);
> //initialize TMinuit with a maximum of 5 params
> gMinuit->SetFCN(fcn);
>
> Double_t arglist[10];
> Int_t ierflg = 0;
>
> arglist[0] = 1;
> gMinuit->mnexcm("SET ERR", arglist ,1,ierflg);
>
> // Set starting values and step sizes for parameters
> static Double_t vstart[4] = {3, 1 , 0.1 , 0.01};
> static Double_t step[4] = {0.1 , 0.1 , 0.01 , 0.001};
> gMinuit->mnparm(0, "a1", vstart[0], step[0], 0,0,ierflg);
> gMinuit->mnparm(1, "a2", vstart[1], step[1], 0,0,ierflg);
> gMinuit->mnparm(2, "a3", vstart[2], step[2], 0,0,ierflg);
> gMinuit->mnparm(3, "a4", vstart[3], step[3], 0,0,ierflg);
>
> // Now ready for minimization step
> arglist[0] = 500;
> arglist[1] = 1.;
> gMinuit->mnexcm("MIGRAD", arglist ,2,ierflg);
>
> // Print results
> Double_t amin,edm,errdef;
> Int_t nvpar,nparx,icstat;
> gMinuit->mnstat(amin,edm,errdef,nvpar,nparx,icstat);
> gMinuit->mnprin(3,amin);
> }
>
> void fcn(Int_t &npar, Double_t *gin, Double_t &f, Double_t *par, Int_t iflag)
> {
> const Int_t nbins = 5;
> Int_t i;
>
> //calculate chisquare
>
> Double_t chisq = 0;
> Double_t delta;
>
> for (i=0;i<nbins; i++) {
> delta = (z[i]-func(x[i],y[i],par))/errorz[i];
> chisq += delta*delta;
> }
> f = chisq;
> }
>
> Double_t func(float x,float y,Double_t *par)
> {
> Double_t value=( (par[0]*par[0])/(x*x)-1)/ (
> par[1]+par[2]*y-par[3]*y*y);
> return value;
> }
>
> }
>
>
> and here is the error message:
>
> Limitation: Can not define body of function in tempfile
> FILE:/usr/users/root/./a1.c LINE:6
> *** Interpreter error recovered ***
>
>
> Thanks again for your help.
>
> Wolfgang