How to create an user-defined function with variable number of parameter

Dear Root users,

I would like to create an user-defined function, then using it for fitting. It’s easy if the number of function parameter is constant. I did like tutorial:

double user_function(double *x, double par) // n parameters => constant
{
return x
par[0]+par[1]/x + … par[n];
}

However, I want to do something like this:

double user_function(int n, double *x, double *par) // n parameters => user defined
{
double result = 0;
for (int i=0; i<n; i++) result=result+par[i]*exp(x**i);
return result;
}

In this case, I can determine the number of parameter that I want when I create TF1 for fitting like this:

TF1 *f = new TF1(“f”,user_function(3),3,0,10);

Unfortunately, It does not work. The error is: Function user_function(3) is not defined in current scope.

So, I want to know if there is any way to realize my idea above?

I hope you can understand what I want to do, because my english skill is so bad.

Thank you very much,

See maybe “A general C++ function object (functor) with parameters” in the TF1 class description and the ${ROOTSYS}/tutorials/math/exampleFunctor.C and ${ROOTSYS}/tutorials/math/multidimSampling.C tutorials.

Dear Pepe,

I don’t get any clue in your recommended links. Could you please show me more?

Thanks a lot,

Another possible solution is to define “p[0]” as a “fixed parameter” which defines the number of “free parameters” (which start with “p[1]”, …).

Dear Pepe,

Thank you very much. Your first propose gives me the method to realize my idea. But I have not succeeded yet!

If you have time, could you please help me to check my simple code below. I used root 5.34.32. I got:

Error: Can’t call TF1::TF1(“f1”,obj,1,7,2) in current scope E:\Download\Anh
TA\test.C(16)
Possible candidates are…

Thank you so much,

[code]class MyFunctionObject {
public:
// use constructor to customize your function object
double operator() (double *x, double *par) {
return x[0]*par[0]+(x[0]**2)*par[1];
// function implementation using class data members
}
};

void run()
{
Double_t x[7]={1,2,3,4,5,6,7};
Double_t y[7]={1.1, 2.3, 2.9,4.2,6.5,6.8,8.2};
gr = new TGraph(7,x,y);
MyFunctionObject obj;
TF1 *f1 = new TF1(“f1”,obj,1,7,2);
gr->Fit(f1,“r”);
gr->Draw(“APL”);
}[/code]

[code]#include “TGraph.h”
#include “TF1.h”

class MyFunctionObject {
public:
// use constructor to customize your function object
double operator() (double *x, double *par) {
return x[0]*par[0]+(x[0]*x[0])*par[1];
// function implementation using class data members
}
};

void run()
{
Double_t x[7]={1,2,3,4,5,6,7};
Double_t y[7]={1.1, 2.3, 2.9,4.2,6.5,6.8,8.2};
TGraph *gr = new TGraph(7,x,y);
MyFunctionObject *obj = new MyFunctionObject();
TF1 *f1 = new TF1(“f1”, obj, 1, 7, 2, “MyFunctionObject”);
f1->SetParameters(1, 1); // must set initial values of parameters
gr->Fit(f1,“r”);
gr->Draw(“APL”);
}[/code]