Hello!
I want to fit my data by nonlinear function, so I must define start parameters.
For example:
Double_t fitFunction(Double_t *x,Double_t *par)
{
//just for example
return Exp(x[0]*par[0]) + par[1] ;
}
void Fit ()
{
vector<double> xv;
vector<double> yv;
//fill vectors ...
TGraph * gr = new TGraph(xv.size(), &xv[0], &yv[0]);
TF1 *fitFcn = new TF1("fitFcn", fitFunction, 0, 1, 2);
fitFcn->SetParameter(0, 0.5);
fitFcn->SetParLimits(0, 0, 1);
fitFcn->SetParameter(1, 0.5);
fitFcn->SetParLimits(1, 0, 1);
gr->Fit("fitFcn", "R");
gr->Draw("AP");
}
My fit is bad, so I want to define new start parameters.
I try to do this in the following manner:
void Fit ()
{
// old code
vector<double> xv;
vector<double> yv;
//fill vectors ...
TGraph * gr = new TGraph(xv.size(), &xv[0], &yv[0]);
TF1 *fitFcn = new TF1("fitFcn", fitFunction, 0, 1, 2);
fitFcn->SetParameter(0, 0.5);
fitFcn->SetParLimits(0, 0, 1);
fitFcn->SetParameter(1, 0.5);
fitFcn->SetParLimits(1, 0, 1);
gr->Fit("fitFcn", "R");
//new code
if( fitFcn->GetChisquare() / fitFcn->GetNDF() > 1)
{
fitFcn->SetParameter(0, 0.2);//new start value
fitFcn->SetParLimits(0, 0, 1);
fitFcn->SetParameter(1, 0.8);////new start value
fitFcn->SetParLimits(1, 0, 1);
gr->Fit("fitFcn", "R");
}
gr->Draw("AP");
}
Unfortunately, this method does not work and my fit the same.
But I don’t know for sure: my new code is wrong or my code is right and minimiser found the same minimum.
How to define new parameters properly?