本篇主要介紹在三種插值方法:拉格朗日插值、分段線性插值、三次樣條插值,以及這三種方法在matlab中如何實現。
1.拉格朗日插值:
1.1基本原理:先構造一組基函數:
是次多項式,滿足
令
上式稱爲次Lagrange插值多項式。
1.2用Matlab作Lagrange插值:
matlab沒有現成的lagrange函數,需要手動寫,如下:
x0,y0爲原始座標點,維度必須相同。
x爲待插值的點。
y是返回值,是最終插值結果。
function y=lagrange(x0,y0,x) %x0,y0爲初始座標,x爲需要插值的點,返回的y爲插值結果
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=0;
for j=1:n
p=1;
for k=1:n
if k~=j
p=p*((z-x0(j))/(x0(k)-x0(j)));
end
end
s=p*y0(k)+s;
end
y(i)=s;
end
2.分段線性插值:
2.1基本原理:
將每兩個相鄰的節點用直線連起來,如此形成的一條折線就是分段線性插值函數。計算點的插值時,只用到左右的兩個節點,計算量與節點個數n(初始值x0,y0的長度,n=length(x0))無關,而拉格朗日插值與n值有關。分段線性插值中n越大,分段越多,插值誤差越小。
2.2Matlab實現分段線性插值:
用matlab實現分段線性插值不需要自己手動編寫函數,matlab有現成的一維插值函數interp1
y=interp1(x0,y0,x,'method')
method指定插值方法,其值可爲:
linear:線性插值(默認)
nearest:最近項插值
spline:逐次3次樣條插值
cubic:保凹凸性 3 次插值
所有插值方法都要求x0單調。
3.三次樣條插值:
使用三次樣條插值有兩種方法:其中一種就是第二種插值方式(分段線性插值),只需要將method修改爲spline即可實現。
還有一種實現方式如下:
pp=csape(x0,y0);
y=ppval(pp,x);
其中x0,y0,x與前面含義相同,返回值y即插值結果。
4.彩蛋(例題):
表1給出的 x, y 數據位於機翼斷面的下輪廓線上,假設需要得到 x 座標每改變0.1 時的 y 座標。試完成加工所需數據,畫出曲線。要求用 Lagrange、分段線性和三次樣條三種插值方法計算。
表1
x 0 3 5 7 9 11 12 13 14 15 |
y 0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6 |
解:編寫代碼如下:
clear,clc
x0=[0,3,5,7,9,11,12,13,14,15];
y0=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6];
x1=[0:0.1:15];
%拉格朗日插值
y1=lagrange(x0,y0,x1);
figure
plot(x0,y0,x1,y1,'.')
title('拉格朗日插值')
%分段線性插值
y2=interp1(x0,y0,x1);
figure
plot(x0,y0,x1,y2,'.')
title('分段線性插值')
%三次樣條插值
y3=interp1(x0,y0,x1,'spline');
figure
plot(x0,y0,x1,y3,'.')
title('三次樣條插值')
結果圖爲:
由圖可知:拉格朗日插值誤差較大,插值大量點的時候不建議使用。分段線性插值結果最好,使用的是method是linear(默認)。三次樣條插值有點誤差,但不是很大,得到的曲線比較光滑。
學習插值函數時的一點小心得,希望能幫到大家!