forum.alglib.net
http://forum.alglib.net/

lsfitfit is going crazy (nonlinear fit not near any points)
http://forum.alglib.net/viewtopic.php?f=2&t=2231
Page 1 of 1

Author:  dediggefedde [ Fri Jan 30, 2015 5:34 pm ]
Post subject:  lsfitfit is going crazy (nonlinear fit not near any points)

Hello again!

I tried working with lsfitfit again, to fit a nonlinear function:
y=c0 (x0+c1)^2/(1+c2* x1).

I would like to get c0, c1 and c2 by providing datapoints ({x0,x1},y).
However, I don't have a high amount of datapoints (~3-5) and only the order of magnitude for c-starting parameter.

As a side-note, is this function solving the equation system when only called with 3 parameters? As far as I have experienced, it doesn't seem to and usually gets unaccurate at the 4th or 5th digit.

A set of Parameters that I call the function with:
Code:
y="[130.9045354801, 135.9066659041, 131.9036065061, 123.9053434201]";
x="[[32.13088888,128],[46.53452299,126],[49.49980573,128],[45.8625616,132]]";


For this, the solution should be around c="[0.069118, 1184,4528.38, 0.810883]";

The settings I call it with:
Code:
c="[0.01,1000,0.1]"
cScale[0]=0.01;
cScale[1]=1000;
cScale[2]=0.1;
epsf=1e-10;
epsx=1e-10;
maxits=0;
diffstep=1e-7;
bndl="[-1e8,-1e8,-1e8]";
bndu="[-1e8,-1e8,-1e8]";


The function and gradient:
Code:
void function_cx_1_func(const real_1d_array &c, const real_1d_array & x, double &func, void *ptr) {
   func = c[0] * square(x[0] + c[1]) / square(1.0 + c[2] * x[1]);
}
void function_cx_1_grad(const real_1d_array &c, const real_1d_array & x, double &func, real_1d_array &grad, void *ptr) {
   grad[0] = square(x[0] + c[1]) / square(1 + c[2] * x[1]);
   grad[1] = 2 * c[0] * (x[0] + c[1]) / square(1 + c[2] * x[1]);
   grad[2] = -2 * c[0] * c[1] * square(x[0] + c[1]) / (square(1 + c[2] * x[1])*(1 + c[2] * x[1]));
}


and the call to lsfitfit:
Code:
lsfitcreatefg(x, y, c, diffstep, state);
lsfitsetcond(state, epsf, epsx, maxits);
lsfitsetbc(state, bndl, bndu);
lsfitsetscale(state, cScale);
alglib::lsfitfit(state, function_cx_1_func, function_cx_1_grad);
lsfitresults(state, info, c, rep);


However, last time I tried this, the y-values of the fittet function at the x-coordinates were around 0.1 instead of 130... So I guess I messed up some accuracy-parameters...
However after searching for days I still can't seem to find any clue how to use this right...

Can someone please tell me if I misunderstood the using of e.g. epsx/epsf/cScale/diffstep to get a accurate fit?

Page 1 of 1 All times are UTC
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/