Cubic interpolation coefficients and basis matrix

조회 수: 6 (최근 30일)
Alessandro Maria Marco
Alessandro Maria Marco 2024년 1월 29일
댓글: Alessandro Maria Marco 2024년 2월 6일
Suppose I have n data points (x(i),y(i)) with i=1,..,n. I want to compute a cubic interpolant that fits exactly these points (interpolation, not least squares fit). I can do the following in Matlab:
x_min = -1;
x_max = 1;
nx = 10;
x = linspace(x_min,x_max,nx)';
y = exp(-x);
pp = csapi(x,y); %Can also use spline
disp(pp)
form: 'pp' breaks: [-1 -0.7778 -0.5556 -0.3333 -0.1111 0.1111 0.3333 0.5556 0.7778 1] coefs: [9×4 double] pieces: 9 order: 4 dim: 1
This returns the coefficients in the matrix pp.coefs: each row l (for l=1,..,n-1) of this matrix gives the 4 coefficients of the cubic polynomial for the specific subinterval l. However, I would like the cubic in another form. A cubic spline can be written as
(1)
where phi_j(x) are the basis functions and c is a vector of n+2 coefficients. How can I get these n+2 coefficients (and, optionally the basis matrix Phi)? The Matlab functions csapi and spline give this (n-1)*4 matrix of coefficients which is not what I want.
Reference: The source for (1) is Fehr and Kindermann, "Computational Economics", Oxford University Press, page 93.
Any help is greatly appreciated, thanks!
  댓글 수: 5
Alessandro Maria Marco
Alessandro Maria Marco 2024년 1월 30일
편집: Alessandro Maria Marco 2024년 1월 30일
The basis functions are defined recursively. This stuff is known as B-splines, I think Matlab should have it
Torsten
Torsten 2024년 1월 30일
편집: Torsten 2024년 1월 30일
Then you will have to sum the B_(j,3) functions that have non-zero support in [t_i,t_i+1] and equate this sum to the usual cubic spline representation coming from "csape" in [t_i,t_i+1]. Comparison of coefficients of the two cubic polynomials in all subintervals should give you a linear system of equations to determine the alpha_i coeffcients from the "csape" coefficients.

댓글을 달려면 로그인하십시오.

채택된 답변

Matt J
Matt J 2024년 1월 30일
편집: Matt J 2024년 1월 30일
Using this FEX downloadable,
x_min = -1;
x_max = 1;
nx = 10;
x = linspace(x_min,x_max,nx)';
xx=linspace(x(1),x(end),1000)';
fun=@(in)csapi(x,in,xx);
Basis=func2mat(fun,x); %Columns of this matrix are basis functions
y=exp(-x);
yy=exp(-xx);
c=Basis\yy; %Coefficients
subplot(1,2,1)
h=plot(x,y,'o',xx,Basis*c,'.r'); axis square
title({'Interp by Basis'; 'Matrix Multiplication'})
subplot(1,2,2)
plot(Basis); axis square
title 'Basis functions'
  댓글 수: 1
Alessandro Maria Marco
Alessandro Maria Marco 2024년 2월 6일
Thanks for your answer! I wanted to note that there is another way to do this using the routine "spcol" from the curve fitting toolbox. Might be useful for those users who have the curve fitting toolbox and prefer not to download extra functions from FEX.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Spline Postprocessing에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by