Substract fitted values from original data
4 views (last 30 days)
Show older comments
Serhii Tetora
on 29 Sep 2020
Commented: Ameer Hamza
on 29 Sep 2020
I want to substract fit values from original data. Here is my code. What is wrong? Why Z and fitresult values are not equal? (see plot)
[xData, yData] = prepareCurveData(xdata,zz);
ft = fittype( 'sin4' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Normalize = 'on';
[fitresult, ~] = fit(xData, yData, ft, opts );
warning('off','curvefit:fit:equationBadlyConditioned')
x = xData;
y = yData;
varnames = coeffnames(fitresult)
varvalues = coeffvalues(fitresult)
for i = 1:length(varnames)
eval([varnames{i},'=',num2str(varvalues(i)),';']);
end
Z = a1*sin(b1*x+c1) +a2*sin(b2*x+c2) +a3*sin(b3*x+c3) + a4*sin(b4*x+c4);
figure
plot(x,y)
hold on
plot(fitresult)
plot(x,Z)
legend('data','fit function','fit exact values')
%%
z_INT = Z_int-Z;
0 Comments
Accepted Answer
Ameer Hamza
on 29 Sep 2020
Edited: Ameer Hamza
on 29 Sep 2020
First, eval is evil; avoid it as much as possible: https://www.mathworks.com/matlabcentral/answers/304528-tutorial-why-variables-should-not-be-named-dynamically-eval . Also, in your case, there is no need, you can directly evaluate fitresult
y_predictions = fitresult(xData)
For the issue in your question. This seems to be a bug in the implementation of fit() function (unless I am overlooking something). For some reason, the fitresult does not report the coefficient value correctly. The issue resolves if you don't pass the opts structure to fit()
[fitresult, ~] = fit(xData, yData, ft);
2 Comments
More Answers (0)
See Also
Categories
Find more on Fit Postprocessing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!