Re: FindFit bug
- To: mathgroup at smc.vnet.net
- Subject: [mg116077] Re: FindFit bug
- From: "Sjoerd C. de Vries" <sjoerd.c.devries at gmail.com>
- Date: Tue, 1 Feb 2011 06:52:54 -0500 (EST)
- References: <ii5rhr$fh4$1@smc.vnet.net>
This is not a bug.
As the documentation of FindFit clearly states: "In the nonlinear
case, it finds in general only a locally optimal fit."
So, Mathematica has found a local optimum but not a global one due to
its starting values of the parameters. Try providing some starting
parameters that are in the right neighbourhod and you'll see it finds
a much better fit:
fit = FindFit[dat, a Sin[w t + f], {{a, 3.3}, {w, 2.5}, {f, 1.5}}, t]
{a -> 3., w -> 3., f -> 1.}
Another option would be to experiment with different methods:
In[10]:= FindFit[dat, a Sin[w t + f], {a, w, f}, t,
Method -> #] & /@ {"ConjugateGradient", "Gradient",
"LevenbergMarquardt", "Newton", "NMinimize", "QuasiNewton"}
Out[10]= {{a -> 8.68943, w -> 0.0199648,
f -> 0.00865477}, {a -> 2.54082, w -> 0.0678487,
f -> 0.0294072}, {a -> 0.599211, w -> 1.51494,
f -> 3.80421}, {a -> 53.7406, w -> 0.00322877,
f -> 0.00139811}, {a -> -3., w -> -3., f -> -1.}, {a -> 24.9028,
w -> 0.00696196, f -> 0.00301903}}
In this case NMinimize seems to be the best choice.
Cheers -- Sjoerd
On Jan 31, 9:23 am, Igor <igor.vol... at gmail.com> wrote:
> Hello,
> It seems that FindFit cannot fit a sine function.
> It produces no warnings and gives a totally
> wrong answer:
>
> dat = Table[{t, 3 Sin[3 t + 1]}, {t, -3, 3, 0.1}];
>
> fit = FindFit[dat, a Sin[w t + f], {a, w, f}, t]
>
> Show[ListPlot[dat], Plot[a Sin[w t + f] /. fit, {t, -3, 3}]]
>
> Output: {a -> 0.599211, w -> 1.51494, f -> 3.80421}
>
> At the same time it fits Sin[3t+1] just fine.