线性插值的原理很简单,自行百度即可。三次样条插值,具体的原理网上也已经有很多了,这里不再赘述,具体可参考样条插值(Spline Interpolation)-云社区-华为云 (huaweicloud.com)
matlab本身自带有interp1和interp2,可直接调用,具体调用方式为:
yy = interp1(x, y, xx,'spline');
yy = interp1(x, y, xx,'linear');
zz = interp2(x,y,z,xx,yy,'spline');
zz = interp2(x,y,z,xx,yy,'linear');
我这里分享几个我自己写的代码,想知道插值具体是怎么实现的同学可以参考,直接上代码:
首先是三次样条插值,其中求逆矩阵是用的高斯消元法
function yy=spline3(x,y,xx)
n=length(x)-1;
G1=zeros(2*n,4*n);
for i=1:n
tmp=[x(i)^3,x(i)^2,x(i)^1,1;x(i+1)^3,x(i+1)^2,x(i+1)^1,1];
G1(2*i-1:2*i,4*i-3:4*i)=tmp;
tmp=[y(i);y(i+1)];
D1(2*i-1:2*i,:)=tmp;
end
G2=zeros(n-1,4*n);
for i=1:n-1
tmp=[3*x(i+1)^2,2*x(i+1),1,0,-3*x(i+1)^2,-2*x(i+1),-1,0];
G2(i,4*i-3:4*i+4)=tmp;
end
D2=zeros(size(G2,1),1);
G3=zeros(n-1,4*n);
for i=1:n-1
tmp=[6*x(i+1),2,0,0,-6*x(i+1),-2,0,0];
G3(i,4*i-3:4*i+4)=tmp;
end
D3=zeros(size(G3,1),1);
G4=zeros(2,4*n);
tmp1=[6*x(1),2,0,0];
tmp2=[6*x(end),2,0,0];
G4(1,1:4)=tmp1;
G4(2,end-3:end)=tmp2;
D4=[0,0]';
G=[G1;G2;G3;G4];
D=[D1;D2;D3;D4];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%