Matlab Curve Fitting via Optimization

I have tried to follow this tutorial to fit a curve to my dataset . The equation for the curve should be f(t)=log10((wpmcoeff./(t.^2))+((1.038+3.*log(2.*pi.*1e6.*t)).*fpmcoeff./(t.^2))+(wfmcoeff./t))+(ffmcoeff)+(rwfmcoeff.*t).
I have created the following code:
clock='atomicclockgpsworld.txt';
data=importdata(clock);
carrier=10e6;
sig=data(:,2);
t=data(:,1);
sigsq=log10(sig.^2);
fun = @(coeff)sseval(coeff,t,sigsq);
x0 = rand(5,1);
bestx = fminsearch(fun,x0);
wpmcoeff = bestx(1);
fpmcoeff = bestx(2);
wfmcoeff = bestx(3);
ffmcoeff = bestx(4);
rwfmcoeff = bestx(5);
yfit=log10((wpmcoeff./(t.^2))+((1.038+3.*log(2.*pi.*1e6.*t)).*fpmcoeff./(t.^2))+(wfmcoeff./t))+(ffmcoeff)+(rwfmcoeff.*t);
semilogx(t,sigsq,'x');
hold on
semilogx(t,yfit);
saveas(gcf,'fit','png');
and the corresponding function
function sse = sseval(coeff,t,sigsq)
wpmcoeff = coeff(1);
fpmcoeff = coeff(2);
wfmcoeff = coeff(3);
ffmcoeff = coeff(4);
rwfmcoeff = coeff(5);
sse = sum(sigsq - (log10((wpmcoeff./(t.^2))+((1.038+3.*log(2.*pi.*1e6.*t)).*fpmcoeff./(t.^2))+(wfmcoeff./t)+(ffmcoeff)+(rwfmcoeff.*t))));
end
But the fit produced is horrible (my y data should vary between approximately -20 to -22 but the fit produces a curve that reaches 1e59!). Can anyone suggest where I may be going wrong?

3 Comments

You forgot to square the differences between measured data and fit function data.
Furthermore, it might happen that parameters are produced that give complex numbers for your log-expressions in the fit function.
Best wishes
Torsten.
Hi Torsten,
Thank you for your help. I have now squared the differences and removed the log from my function (it was not necessary, purely for formatting purposes). I have also used fmincon in place of fminsearch to constrain my coefficients between 0-1.
Code:
rng default % for reproducibility
clock='atomicclockgpsworld.txt';
data=importdata(clock);
carrier=10e6;
sig=data(:,2);
t=data(:,1);
sigsq=sig.^2;
fun = @(coeff)sseval(coeff,t,sigsq);
x0 = rand(5,1);
%bestx = fminsearch(fun,x0);
ub = [1,1,1,1,1];
lb = [realmin,realmin,realmin,realmin,realmin];
bestx = fmincon(fun,x0,[],[],[],[],lb,ub);
wpmcoeff = bestx(1);
fpmcoeff = bestx(2);
wfmcoeff = bestx(3);
ffmcoeff = bestx(4);
rwfmcoeff = bestx(5);
yfit=(wpmcoeff./(t.^2))+((1.038+3.*log(2.*pi.*1e6.*t)).*fpmcoeff./(t.^2))+(wfmcoeff./t)+(ffmcoeff)+(rwfmcoeff.*t);
figure
loglog(t,sigsq,'x');
hold on
loglog(t,yfit,'x');
saveas(gcf,'fit','png');
Function:
function sse = sseval(coeff,t,sigsq)
wpmcoeff = coeff(1);
fpmcoeff = coeff(2);
wfmcoeff = coeff(3);
ffmcoeff = coeff(4);
rwfmcoeff = coeff(5);
sse = sum((sigsq - ((wpmcoeff./(t.^2))+((1.038+3.*log(2.*pi.*1e6.*t)).*fpmcoeff./(t.^2))+(wfmcoeff./t)+(ffmcoeff)+(rwfmcoeff.*t))).^2);
end
However I still cannot get a curve which matches up with my data points. Do you have any other suggestions?
Hi Bethany, I have exactly the the same issue here. Were you ever able to resolve this issue? If so, how? Thank you

Sign in to comment.

Answers (0)

Categories

Products

Asked:

on 16 Feb 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!