[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
2.9.12 Nonlinear fitting hints
Nonlinear fitting is rather simple. All that you need is the data to fit, the approximation formula and the list of coefficients to fit (better with its initial guess values). Let me demonstrate it on the following simple example. First, let us use sin function with some random noise:
mglData rnd(100), in(100); //data to be fitted and ideal data gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)"); gr->Fill(in,"0.3+sin(2*pi*x)");
and plot it to see that data we will fit
gr->Title("Fitting sample"); gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, ". "); gr->Axis(); gr->Plot(in, "b"); gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b");
The next step is the fitting itself. For that let me specify an initial values ini for coefficients ‘abc’ and do the fitting for approximation formula ‘a+b*sin(c*x)’
mreal ini[3] = {1,1,3}; mglData Ini(3,ini); mglData res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini);
Now display it
gr->Plot(res, "r"); gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); gr->PutsFit(mglPoint(0, -1.8), "y = ", "r");
NOTE! the fitting results may have strong dependence on initial values for coefficients due to algorithm features. The problem is that in general case there are several local "optimums" for coefficients and the program returns only first found one! There are no guaranties that it will be the best. Try for example to set ini[3] = {0, 0, 0}
in the code above.
The full sample code for nonlinear fitting is:
int sample(mglGraph *gr) { mglData rnd(100), in(100); gr->Fill(rnd,"0.4*rnd+0.1+sin(2*pi*x)"); gr->Fill(in,"0.3+sin(2*pi*x)"); mreal ini[3] = {1,1,3}; mglData Ini(3,ini); mglData res = gr->Fit(rnd, "a+b*sin(c*x)", "abc", Ini); gr->Title("Fitting sample"); gr->SetRange('y',-2,2); gr->Box(); gr->Plot(rnd, ". "); gr->Axis(); gr->Plot(res, "r"); gr->Plot(in, "b"); gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b"); return 0; }
[ << ] | [ < ] | [ Up ] | [ > ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated on March 21, 2014 using texi2html 5.0.