How to generate a smooth derivative after fitting a curve to the data?

40 visualizaciones (últimos 30 días)
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 comentarios
Matt J
Matt J el 1 de Ag. de 2022
I've added some lines of code and RUN output to the original post.
Torsten
Torsten el 1 de Ag. de 2022
I get this graph for the second derivative in OCTAVE:
Sorry, it's the first derivative that I included as graphics.

Iniciar sesión para comentar.

Respuesta aceptada

Bruno Luong
Bruno Luong el 1 de Ag. de 2022
Editada: Bruno Luong el 1 de Ag. de 2022
You have to FIT the spline, not interpolate.
For example I use my own tool BSFK avalable in FEX.
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')
  5 comentarios
Bruno Luong
Bruno Luong el 1 de Ag. de 2022
Editada: Bruno Luong el 1 de Ag. de 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.
azarang asadi
azarang asadi el 2 de Ag. de 2022
Thank you so much for all the help. appreciated

Iniciar sesión para comentar.

Más respuestas (1)

Matt J
Matt J el 1 de Ag. de 2022
Editada: Matt J el 1 de Ag. de 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])])

Categorías

Más información sobre Spline Postprocessing en Help Center y File Exchange.

Productos


Versión

R2020a

Community Treasure Hunt

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

Start Hunting!

Translated by