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/ |