4
$\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$
1
  • $\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$ Commented Oct 19, 2014 at 21:40

1 Answer 1

8
$\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 and acknowledge you have read our privacy policy.

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