 
 
 
 
 
 
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

