Asked by Dejan
on 14 Mar 2014

I have a series of data points that are governed by a sinusoidal function.

I want to fit, plot and generate a sinusoidal function to these data points.

I do not wish to fit an nth degree polynomial to this no matter how close it is to the sinusoidal function.

I understand that there is no standard tool in the toolbox that does this. I have looked at numerous and plenty of old threads and internet posts. None of the answers help me.

Please take into account that I am new to Matlab and can only curve fit very basic data points.

What I therefore need is an exact and step by step guide in how to fit a sine curve to data points.

Please assist.

Answer by Star Strider
on 15 Mar 2014

Edited by Star Strider
on 15 Mar 2014

Accepted Answer

Here’s my suggested solution, using only core MATLAB functions:

yu = max(y);

yl = min(y);

yr = (yu-yl); % Range of ‘y’

yz = y-yu+(yr/2);

zx = x(yz .* circshift(yz,[0 1]) <= 0); % Find zero-crossings

per = 2*mean(diff(zx)); % Estimate period

ym = mean(y); % Estimate offset

fit = @(b,x) b(1).*(sin(2*pi*x./b(2) + 2*pi/b(3))) + b(4); % Function to fit

fcn = @(b) sum((fit(b,x) - y).^2); % Least-Squares cost function

s = fminsearch(fcn, [yr; per; -1; ym]) % Minimise Least-Squares

xp = linspace(min(x),max(x));

figure(1)

plot(x,y,'b', xp,fit(s,xp), 'r')

grid

The elements of output parameter vector, s ( b in the function ) are:

s(1): sine wave amplitude (in units of y)

s(2): period (in units of x)

s(3): phase (phase is s(2)/(2*s(3)) in units of x)

s(4): offset (in units of y)

It provides a good fit.

Kunal Kumar Saraf
on 4 Aug 2017

Ahmad Suliman
on 7 Sep 2017

Baha411
on 15 Sep 2017

This code is not working man, e.g. for, x = 2* pi*rand(100,1); x = sortrows(x); y = 9 + 7*sin(2*x + 4*pi) + randn(100,1);

Am I missing something on this?

Sign in to comment.

Answer by Jos (10584)
on 14 Mar 2014

Dejan
on 15 Mar 2014

Im relatively new to Matlab and whilst the link provided I kinda get, its not an exact step by step guide on how to fit a Sine wave.

Here are my data points:

x = [ 0 10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 ]

y = [ 16.5 14.32 11.58 10.017 9.629 10.2 12.16 15.08 16.97 16.75 14.331 11.508 10.013 9.617 10.22 12.15 15.304 17.38 16.853 ]

I need a Sine wave to fit that data and its governing equation

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## Douglas Lim (view profile)

Direct link to this comment:https://www.mathworks.com/matlabcentral/answers/121579-curve-fitting-to-a-sinusoidal-function#comment_346318

Sign in to comment.