How to generate a smooth derivative after fitting a curve to the data?
32 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
azarang asadi
am 1 Aug. 2022
Kommentiert: azarang asadi
am 2 Aug. 2022
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 Kommentare
Torsten
am 1 Aug. 2022
I get this graph for the second derivative in OCTAVE:
Sorry, it's the first derivative that I included as graphics.
Akzeptierte Antwort
Bruno Luong
am 1 Aug. 2022
Bearbeitet: Bruno Luong
am 1 Aug. 2022
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 Kommentare
Bruno Luong
am 1 Aug. 2022
Bearbeitet: Bruno Luong
am 1 Aug. 2022
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)
Weitere Antworten (1)
Matt J
am 1 Aug. 2022
Bearbeitet: Matt J
am 1 Aug. 2022
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])])
Siehe auch
Kategorien
Mehr zu Spline Postprocessing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!