#include "TLinearFitter.h"
#include "TF1.h"
#include "TRandom.h"
void fitLinear2()
{
Int_t n=100;
Int_t i;
TRandom rand;
TLinearFitter *lf=new TLinearFitter(5);
lf->SetFormula("hyp5");
Double_t *x=new Double_t[n*10*5];
Double_t *y=new Double_t[n*10];
Double_t *e=new Double_t[n*10];
for (i=0; i<n; i++){
x[0 + i*5] = rand.Uniform(-10, 10);
x[1 + i*5] = rand.Uniform(-10, 10);
x[2 + i*5] = rand.Uniform(-10, 10);
x[3 + i*5] = rand.Uniform(-10, 10);
x[4 + i*5] = rand.Uniform(-10, 10);
e[i] = 0.01;
y[i] = 4*x[0+i*5] + x[1+i*5] + 2*x[2+i*5] + 3*x[3+i*5] + 0.2*x[4+i*5] + rand.Gaus()*e[i];
}
lf->AssignData(n, 5, x, y, e);
lf->Eval();
TVectorD params;
TVectorD errors;
lf->GetParameters(params);
lf->GetErrors(errors);
for (Int_t i=0; i<6; i++)
printf("par[%d]=%f+-%f\n", i, params(i), errors(i));
Double_t chisquare=lf->GetChisquare();
printf("chisquare=%f\n", chisquare);
for (i=n; i<n*2; i++) {
x[0+i*5] = rand.Uniform(-10, 10);
x[1+i*5] = rand.Uniform(-10, 10);
x[2+i*5] = rand.Uniform(-10, 10);
x[3+i*5] = rand.Uniform(-10, 10);
x[4+i*5] = rand.Uniform(-10, 10);
e[i] = 0.01;
y[i] = 4*x[0+i*5] + x[1+i*5] + 2*x[2+i*5] + 3*x[3+i*5] + 0.2*x[4+i*5] + rand.Gaus()*e[i];
}
lf->AssignData(n*2, 5, x, y, e);
lf->Eval();
lf->GetParameters(params);
lf->GetErrors(errors);
printf("\nMore Points:\n");
for (Int_t i=0; i<6; i++)
printf("par[%d]=%f+-%f\n", i, params(i), errors(i));
chisquare=lf->GetChisquare();
printf("chisquare=%.15f\n", chisquare);
lf->SetFormula("x0++x1++x2++x3++x4");
lf->Eval();
lf->GetParameters(params);
lf->GetErrors(errors);
printf("\nWithout Constant\n");
for (Int_t i=0; i<5; i++)
printf("par[%d]=%f+-%f\n", i, params(i), errors(i));
chisquare=lf->GetChisquare();
printf("chisquare=%f\n", chisquare);
lf->SetFormula("hyp5");
lf->FixParameter(1, 4);
lf->Eval();
lf->GetParameters(params);
lf->GetErrors(errors);
printf("\nFixed Constant:\n");
for (i=0; i<6; i++)
printf("par[%d]=%f+-%f\n", i, params(i), errors(i));
chisquare=lf->GetChisquare();
printf("chisquare=%.15f\n", chisquare);
delete lf;
}
|
|