拉格朗日插值、分段線性插值、三次樣條插值

本篇主要介紹在三種插值方法:拉格朗日插值、分段線性插值、三次樣條插值,以及這三種方法在matlab中如何實現。

1.拉格朗日插值:

  1.1基本原理:先構造一組基函數:

l_{i}(x)=\frac{(x-x_{0})...(x-x_{i-1})(x-x_{i+1})...(x-x_{n})}{(x_{i}-x_{0})...(x_{i}-x_{i-1})(x_{i}-x_{i+1})...(x_{i}-x_{n})}

         =\prod_{j=0j\neq i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}}             \left ( i=0,1,...,n \right )

l_{i}(x)n次多項式,滿足

l_{i}(x_{j})=\left\{\begin{matrix} 0 & j\neq i & \\ 1& j=i & \end{matrix}\right.

L_{n}(x)=\sum_{i=0}^{n}y_{i}l_{i}(x)=\sum_{i=0}^{n}y_{i}\left \{ \prod_{j=0j\neq i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}} \right \}

上式稱爲n次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基本原理:

將每兩個相鄰的節點用直線連起來,如此形成的一條折線就是分段線性插值函數。計算x點的插值時,只用到x左右的兩個節點,計算量與節點個數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(默認)。三次樣條插值有點誤差,但不是很大,得到的曲線比較光滑。

 

學習插值函數時的一點小心得,希望能幫到大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章