Re: parameters problem in FindFit
- To: mathgroup at smc.vnet.net
- Subject: [mg92865] Re: parameters problem in FindFit
- From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
- Date: Thu, 16 Oct 2008 05:04:15 -0400 (EDT)
- Organization: The Open University, Milton Keynes, UK
- References: <gd4dl4$bg2$1@smc.vnet.net>
gyzhou at 139.com wrote:
> I get a list like this :
> lis = {{12.5, 1.146}, {32, 1.145}, {50,
> 1.144}, {69, 1.1424}, {84.6,
> 1.139}}
> My aim is :
> FindFit[lis,
> a - (b x^2)/(c + x), {{a, 1.14}, {b, 0.0003}, {c, 300}}, x]
> As we can see, I want this list to be fitted using parameters a, b, c
> around 1.14, 0.0003, 300. However Mathematica gives { b, 10^8} and {c,
> 10^14} far from what I expect.I set "MaxIterations" to less times,
> but it doesn' t make sense.
If you plot your model with the parameters returned by FindFit, you will
see that the fit is quite good. OTHO, the choice of 300 for c seems to
be a poor choice (except if you have some compelling reason from the
physical situation your are modeling). Anyway, try to use different
methods as illustrated below and check the result on a graph.
In[1]:= lst = {{12.5, 1.146}, {32, 1.145}, {50, 1.144}, {69,
1.1424}, {84.6, 1.139}};
In[2]:= model = a - (b x^2)/(c + x);
In[3]:= sol =
FindFit[lst, model, {{a, 1.14}, {b, 0.0003}, {c, 300}}, x]
Out[3]= {a -> 1.14624, b -> 2.45466*10^8, c -> 2.59133*10^14}
In[4]:= solar =
FindFit[lst, model, {a, b, c}, x,
Method -> #] & /@ {"ConjugateGradient", "Gradient",
"LevenbergMarquardt", "Newton", "QuasiNewton"}
During evaluation of In[4]:= FindFit::lstol: The line search \
decreased the step size to within tolerance specified by AccuracyGoal \
and PrecisionGoal but was unable to find a sufficient decrease in the \
norm of the residual. You may need more than MachinePrecision digits \
of working precision to meet these tolerances. >>
Out[4]= {{a -> 1.14769, b -> 0.0000906534,
c -> 1.01529}, {a -> 1.14769, b -> 0.0000906534,
c -> 1.01529}, {a -> 1.14624, b -> 1.49101*10^8,
c -> 1.57403*10^14}, {a -> 1.14388, b -> 9.6559*10^-6,
c -> -37.5354}, {a -> 1.14769, b -> 0.0000906531, c -> 1.01317}}
In[5]:= Plot[{model /. sol, model /. solar[[1]],
model /. {a -> 1.14, b -> 0.0003, c -> 300}}, {x, 10, 100},
Epilog -> Point /@ lst]
In[6]:= sol =
FindFit[lst, model, {{a, 1.14}, {b, 0.0003}, {c, 300}}, x,
Method -> #] & /@ {"ConjugateGradient", "Gradient",
"LevenbergMarquardt", "Newton", "QuasiNewton"}
During evaluation of In[6]:= FindFit::lstol: The line search \
decreased the step size to within tolerance specified by AccuracyGoal \
and PrecisionGoal but was unable to find a sufficient decrease in the \
norm of the residual. You may need more than MachinePrecision digits \
of working precision to meet these tolerances. >>
During evaluation of In[6]:= FindFit::lstol: The line search \
decreased the step size to within tolerance specified by AccuracyGoal \
and PrecisionGoal but was unable to find a sufficient decrease in the \
norm of the residual. You may need more than MachinePrecision digits \
of working precision to meet these tolerances. >>
During evaluation of In[6]:= FindFit::lstol: The line search \
decreased the step size to within tolerance specified by AccuracyGoal \
and PrecisionGoal but was unable to find a sufficient decrease in the \
norm of the residual. You may need more than MachinePrecision digits \
of working precision to meet these tolerances. >>
During evaluation of In[6]:= General::stop: Further output of \
FindFit::lstol will be suppressed during this calculation. >>
Out[6]= {{a -> 1.14637, b -> 0.000365391, c -> 300.}, {a -> 1.14637,
b -> 0.000365391, c -> 300.}, {a -> 1.14624, b -> 2.45466*10^8,
c -> 2.59133*10^14}, {a -> 1.14624, b -> 4.13776,
c -> 4.36807*10^6}, {a -> 1.14637, b -> 0.000365391, c -> 300.}}
HTH,
-- Jean-Marc