3
$\begingroup$

I'm trying to fit a sinusoidal wave to some numerical data. I can do it by hand using manipulate, so I know roughly the sort of parameter values that I should get back, but functions such as FindFit or NonlinearModel fit are hopeless for some of my datasets.

For example,

data = {0.316228, -0.316228, 0.316228, -0.316228, 0.316228, -0.316228, 0.316228, -0.316228, 0.316228, -0.316228, 0.316228}
FindFit[data, a Sin[bx + c], {a,b,c},x]

FindFit returns

{a -> 0.0687053, b -> 1.13454, c -> 1.04675}

which is hopelessly off. By hand I know I should get something along the lines of

a ~ 0.4, 
c ~ -1,
b ~ 3.1

What am I doing wrong?

For other sinusoidal datasets, FindFit works perfectly!

$\endgroup$
  • $\begingroup$ Please see this link for reasons why you should now be using NonlinearModelFit. Also, you'll find with a bit of digging on this site that nonlinear least squares fits are much more successful when you add better starting guesses. $\endgroup$ – bobthechemist Oct 19 '14 at 21:40
6
$\begingroup$

Use NonlinearModelFit and put in the best guess parameters from your Manipulate.

data = {0.316228, -0.316228, 0.316228, -0.316228, 0.316228, -0.316228,
   0.316228, -0.316228, 0.316228, -0.316228, 0.316228}
eqn[x_] := a Sin[b x + c] 
nlm = NonlinearModelFit[data, eqn[x], {{a, 0.4}, {c, -1}, {b, 3.1}}, 
  x]

Plot[nlm[x] /. fit, {x, 1, 11}, 
 Epilog -> {Red, Point /@ Transpose[{Range@Length@data, data}]}]

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.