# How to find b spline values?

46 views (last 30 days)
azarang asadi on 29 Oct 2020 at 1:18
Answered: Bruno Luong on 29 Oct 2020 at 18:03
Hello,
So I have some position data, I fitted a Bspline on the data and differentiate twice to get the accelerations. But now that I want to find the values of accelerations, I'm confused how to get that so I can divide them some number for normalization. So are the y values of a curve fitted by a bspline same as coefficients? I attached the spline, I need to find the y values of 101 points of this figure.

azarang asadi on 29 Oct 2020 at 14:48
Thankkkkk youuuuuuuuu
azarang asadi on 29 Oct 2020 at 14:49
azarang asadi on 29 Oct 2020 at 17:59
noooo,,, I'm so sorry, I just unaccepted the answer ! I was confused I though he's the one with the answer, please post it againg and I'll accept yours, the fnval helped me. It was yours? please send it again, see I removed the accepted answer

Bruno Luong on 29 Oct 2020 at 18:03
After computing the derivative
spline_position = spaps(time ,x,0,3); % x is a 101 element vector representing postion, I'm fitting a 5th order bspline
acceleration = fnder(spline_position,2); % this gives me a struct, I need to have a 101 acceleration vector corresponsing to each x
run this to evaluate the acceleration
a = fnval(acceleration, time)

Mathieu NOE on 29 Oct 2020 at 11:02
hello
my suggestion below
% test data
x = cumsum(rand(1,10));
y = randn(size(x));
pp = spline(x,y);
% fine grid points
xi = linspace(min(x),max(x),300);
yi = ppval(pp,xi); % spline function values at xi
% first and second derivatives (finite difference scheme)
[dy, ddy] = firstsecondderivatives(xi,yi);
% graphics
figure(1);
plot(x,y,'or',xi,yi,'-b')
yyaxis right
plot(xi,ddy,'-')
ylabel('second derivative')
%%%%%%%%%%%%%%%%%%%%%%
function [dy, ddy] = firstsecondderivatives(x,y)
% The function calculates the first & second derivative of a function that is given by a set
% of points. The first derivatives at the first and last points are calculated by
% the 3 point forward and 3 point backward finite difference scheme respectively.
% The first derivatives at all the other points are calculated by the 2 point
% central approach.
% The second derivatives at the first and last points are calculated by
% the 4 point forward and 4 point backward finite difference scheme respectively.
% The second derivatives at all the other points are calculated by the 3 point
% central approach.
n = length (x);
dy = zeros;
ddy = zeros;
% Input variables:
% x: vector with the x the data points.
% y: vector with the f(x) data points.
% Output variable:
% dy: Vector with first derivative at each point.
% ddy: Vector with second derivative at each point.
dy(1) = (-3*y(1) + 4*y(2) - y(3)) / 2*(x(2) - x(1)); % First derivative
ddy(1) = (2*y(1) - 5*y(2) + 4*y(3) - y(4)) / (x(2) - x(1))^2; % Second derivative
for i = 2:n-1
dy(i) = (y(i+1) - y(i-1)) / 2*(x(i+1) - x(i-1));
ddy(i) = (y(i-1) - 2*y(i) + y(i+1)) / (x(i-1) - x(i))^2;
end
dy(n) = (y(n-2) - 4*y(n-1) + 3*y(n)) / 2*(x(n) - x(n-1));
ddy(n) = (-y(n-3) + 4*y(n-2) - 5*y(n-1) + 2*y(n)) / (x(n) - x(n-1))^2;
end
%%%%%%%%%%%%%%%%%%%%%%%

azarang asadi on 29 Oct 2020 at 14:27
I need a 6th order spline so the polynomials are of degree 5 and the second derivative of degree 3.
Mathieu NOE on 29 Oct 2020 at 14:53
hi
sure - the spline order is 3 here so evident that the second derivative is a first order function
that does not change the logic of my code. you can use higher order polynomials

Mathieu NOE on 29 Oct 2020 at 15:06
hi
basically same code with different input data and 7th order polynomial interpolation
so the second derivative plot looks nicer
% test data
% x = cumsum(rand(1,10));
% y = randn(size(x));
x = linspace(0,4*pi,10);
y = sin(x);
% pp = spline(x,y);
pp = polyfit(x,y,7);
% fine grid points
xi = linspace(min(x),max(x),300);
% yi = ppval(pp,xi); % spline function values at xi
yi = polyval(pp,xi);
% first and second derivatives (finite difference scheme)
[dy, ddy] = firstsecondderivatives(xi,yi);
% graphics
figure(1);
plot(x,y,'or',xi,yi,'-b')
yyaxis right
plot(xi,ddy,'-')
ylabel('second derivative')
%%%%%%%%%%%%%%%%%%%%%%
function [dy, ddy] = firstsecondderivatives(x,y)
% The function calculates the first & second derivative of a function that is given by a set
% of points. The first derivatives at the first and last points are calculated by
% the 3 point forward and 3 point backward finite difference scheme respectively.
% The first derivatives at all the other points are calculated by the 2 point
% central approach.
% The second derivatives at the first and last points are calculated by
% the 4 point forward and 4 point backward finite difference scheme respectively.
% The second derivatives at all the other points are calculated by the 3 point
% central approach.
n = length (x);
dy = zeros;
ddy = zeros;
% Input variables:
% x: vector with the x the data points.
% y: vector with the f(x) data points.
% Output variable:
% dy: Vector with first derivative at each point.
% ddy: Vector with second derivative at each point.
dy(1) = (-3*y(1) + 4*y(2) - y(3)) / 2*(x(2) - x(1)); % First derivative
ddy(1) = (2*y(1) - 5*y(2) + 4*y(3) - y(4)) / (x(2) - x(1))^2; % Second derivative
for i = 2:n-1
dy(i) = (y(i+1) - y(i-1)) / 2*(x(i+1) - x(i-1));
ddy(i) = (y(i-1) - 2*y(i) + y(i+1)) / (x(i-1) - x(i))^2;
end
dy(n) = (y(n-2) - 4*y(n-1) + 3*y(n)) / 2*(x(n) - x(n-1));
ddy(n) = (-y(n-3) + 4*y(n-2) - 5*y(n-1) + 2*y(n)) / (x(n) - x(n-1))^2;
end