How to generate a smooth derivative after fitting a curve to the data?
33 次查看(过去 30 天)
显示 更早的评论
Hi all,
I have a set of data which is attached. I used spline function to fit the data and then fnder to take the second derivative and my results ended to be very noisy. I tried fit(x,y,'smoothinhgspline') and I got a noisy derivative. I don't know how to find a smooth derivative. I'd appreciate your suggestions.
Here's my code:
load Data %Matt J added
% using cubic spline
pp = spline(x,y);
derX= fnder(pp,2);
yy = fnval(derX,x);
% using fit
fit1 = fit( x, y, 'smoothingspline' );
[d1,d2] = differentiate(fit1,x);
when I plot yy and d2, none are smooth, they are very noisy.
plot(x,yy,x,d2) %Matt J added
legend('Non-Smoothed','Smoothed'); %Matt J added
11 个评论
Torsten
2022-8-1
I get this graph for the second derivative in OCTAVE:
Sorry, it's the first derivative that I included as graphics.
采纳的回答
Bruno Luong
2022-8-1
编辑:Bruno Luong
2022-8-1
You have to FIT the spline, not interpolate.
load Data.mat;
pp = BSFK(x,y); % FEX
% Check the spline model
xq = linspace(min(x),max(x),100);
pp1 = ppder(pp); pp2 = ppder(pp1); % You might use fnder, I don't have the toolbox
subplot(2,1,1)
plot(x,y,'.r',xq, ppval(pp,xq),'b')
legend('data', 'spline fitting')
subplot(2,1,2)
plot(xq,ppval(pp2,xq),'b')
ylabel('second derivative')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1085220/image.png)
5 个评论
Bruno Luong
2022-8-1
编辑:Bruno Luong
2022-8-1
OK attached is the script, graphical plot and MATLAB derivative data, if you find anything incoherent with the second derivative (computed by 2 ways) please let me know.
If not you can contact the author of whatever the literature you read and ask him/her to correct.
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1085285/image.png)
更多回答(1 个)
Matt J
2022-8-1
编辑:Matt J
2022-8-1
You can try some different choices of the smoothing parameter,
load Data
% using cubic spline
pp = spline(x,y);
derX= fnder(pp,2);
yy = fnval(derX,x);
plot(x,yy,'--'); hold on
for p=[0.9999,0.999,0.95]
% using fit
fit1 = fit( x, y, 'smoothingspline' ,SmoothingParam=p);
[d1,d2] = differentiate(fit1,x);
legend(string(p))
plot(x,d2);
end; hold off
legend(["Non-Smoothed","p="+string([0.9999,0.999,0.95])])
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Spline Postprocessing 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!