Matlab之插值
Matlab中有5种基本的插值方法:
nearest:最近邻插值法(平面立体均适用)
linear:线性插值法(interp1默认的插值方法)(平面立体均适用)
spline:三次样条插值法(平面立体均适用)
pchip:分段三次厄米多项式插值法(只适用于平面)
cubic:三次多项式插值法(平面立体均适用)
平面插值:
Matlab中的平面插值函数为interp1:
t=1900:10:1990; p=[75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505 249.633]; x=1900:1990; y1=interp1(t, p, x); %默认为linear y2=interp1(t, p, x, 'nearest'); y3=interp1(t, p, x, 'spline'); y4=interp1(t, p, x, 'pchip'); y5=interp1(t, p, x, 'cubic'); subplot(2, 3, 1); plot(x, y1, t, p, 'ro'); title('linear'); subplot(2, 3, 2); plot(x, y2, t, p, 'ro'); title('nearest'); subplot(2, 3, 3); plot(x, y3, t, p, 'ro'); title('spline'); subplot(2, 3, 4); plot(x, y4, t, p, 'ro'); title('pchip'); subplot(2, 3, 5); plot(x, y5, t, p, 'ro'); title('cubic');
注意:interp1(t, p, x)中的(t, p)是对应的精确坐标,x是需要插值的横坐标,返回的是插值后的纵坐标
disp(' year linear nearest spline pchip cubic '); for i=10:20 k(i-9, 1) = 1900+i; k(i-9, 2) = y1(i+1); k(i-9, 3) = y2(i+1); k(i-9, 4) = y3(i+1); k(i-9, 5) = y4(i+1); k(i-9, 6) = y5(i+1); end disp(round(k)); %取整
结果如下:
三维插值:
Matlab中的三维插值函数为interp2:
注意:interp2(x, y, z, x1, y1, method)中的(x, y, z)是对应的精确坐标,x1是需要插值的x坐标,y1是需要插值的y坐标,method可以省略,表示那5种插值方法。返回的是插值后的z坐标
对进行插值:
x=-3*pi:0.5*pi:3*pi; y=x; [X, Y] = meshgrid(x, y); Z=sin(sqrt(X.^2 + Y.^2))./sqrt(X.^2 + Y.^2); subplot(2, 3, 1); mesh(X, Y, Z); title('origin'); x=-3*pi:0.1*pi:3*pi; y=x; [X1, Y1] = meshgrid(x, y); Z1=interp2(X, Y, Z, X1, Y1); %默认用linear法拟合 subplot(2, 3, 2); mesh(X1, Y1, Z1); title('linear'); Z2=interp2(X, Y, Z, X1, Y1, 'nearest'); subplot(2, 3, 3); mesh(X1, Y1, Z2); title('nearest'); Z3=interp2(X, Y, Z, X1, Y1, 'spline'); subplot(2, 3, 4); mesh(X1, Y1, Z3); title('spline'); Z4=interp2(X, Y, Z, X1, Y1, 'cubic'); subplot(2, 3, 5); mesh(X1, Y1, Z4); title('cubic');
除了interp1和interp2插值函数外,Matlab还提供了另外几个插值函数:
1:三次样条插值
2:牛顿插值(多项式插值)
3:切比雪夫插值(Chebyshev)
三次样条插值:
Y=spline(x, y, X)
其中(x, y)是精确点的坐标,X是要插值的x坐标,返回的Y是插值求出的y坐标
x=1:5; y=[1 3 4 3 4]; X=0:0.1:6; Y=spline(x, y, X); plot(X, Y, x, y, 'ro');
如图: