插值方法 —— Python數據工程No.8

1 插值方法的基本概念:

在實際問題中,一個函數y=f(x)y=f(x)往往是通過實驗觀測得到的,僅已知函數f(x)f(x)在某區間[a,b][a, b]上一系列點上的值:yi=f(xi),i=0,1,...,ny_{i}=f(x_{i}),i=0,1,...,n
當需要在在這些節點x0,x1,...,xnx_{0},x_{1},...,x_{n}之間的點xx上的函數值時,常用較簡單的、滿足一定條件的函數g(x)g(x)去代替f(x)f(x),插值法是一種常用方法,其插值函數g(x)g(x)滿足條件:
g(xi)=yi,i=0,1,...,ng(x_{i})=y_{i},i=0,1,...,n

2 三種插值方法及其基本理論

2.1 分段線性插值
將每兩個相鄰的節點用直線連起來,如此形成的一條折線就是分段線性插值函數,記作:In(x){{I}_{n}}\left( x \right) ,它滿足In(xi)=yi{{I}_{n}}\left( {{x}_{i}} \right)={{y}_{i}},且In(x){{I}_{n}}\left( x \right)在每個小區間[xi,xi+1]\left[ {{x}_{i}},{{x}_{i+1}} \right]上是線性函數(i=0,1,,n1)\left( i=0,1,\cdots ,n-1 \right)

In(x)I_{n}(x)可以表示爲In(x)i=0nyili(x){{I}_{n}}\left( x \right)\sum\limits_{i=0}^{n}{{{y}_{i}}{{l}_{i}}\left( x \right)},其中:
在這裏插入圖片描述In(x){{I}_{n}}\left( x \right)有良好的收斂性,即對於x[a,b]x\in \left[ a,b \right],有limxIn(x)=f(x)\underset{x\to \infty }{\mathop{\lim }}\,{{I}_{n}}\left( x \right)=f\left( x \right)

證明:
對於(xi,yi)\left( {{x}_{i}},{{y}_{i}} \right)(xi+1,yi+1)\left( {{x}_{i+1}},{{y}_{i+1}} \right)兩點,根據直線兩點式,我們有:
xxi+1xixi+1=yyi+1yiyi+1\frac{x-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}=\frac{y-{{y}_{i+1}}}{{{y}_{i}}-{{y}_{i+1}}}
y=xxi+1xixi+1(yiyi+1)+yi+1y=\frac{x-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}\cdot \left( {{y}_{i}}-{{y}_{i+1}} \right)+{{y}_{i+1}}
y=xxi+1xixi+1yixxi+1xixi+1yi+1+xixi+1xixi+1yi+1y=\frac{x-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}\cdot {{y}_{i}}-\frac{x-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}\cdot {{y}_{i+1}}+\frac{{{x}_{i}}-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}{{y}_{i+1}}
y=xxi+1xixi+1yi+xxixi+1xiyi+1y=\frac{x-{{x}_{i+1}}}{{{x}_{i}}-{{x}_{i+1}}}\cdot {{y}_{i}}+\frac{x-{{x}_{i}}}{{{x}_{i+1}}-{{x}_{i}}}\cdot {{y}_{i+1}}
得證

2.2 拉格朗日插值

li(x)=(xx0)(xxi1)(xxi+1)(xxn)(xix0)(xixi1)(xixi+1)(xixn){{l}_{i}}\left( x \right)=\frac{\left( x-{{x}_{0}} \right)\cdots \left( x-{{x}_{i-1}} \right)\left( x-{{x}_{i+1}} \right)\cdots \left( x-{{x}_{n}} \right)}{\left( {{x}_{i}}-{{x}_{0}} \right)\cdots \left( {{x}_{i}}-{{x}_{i-1}} \right)\left( {{x}_{i}}-{{x}_{i+1}} \right)\cdots \left( {{x}_{i}}-{{x}_{n}} \right)}

在這裏插入圖片描述
在這裏插入圖片描述
2.3 樣條插值
樣條函數的概念:
樣條(Spline)本來是工程設計中使用的一種繪圖工具,是富有彈性的細木條或金屬條。繪圖員利用它把一些已知點連接成一條光滑曲線(稱樣條曲線),並使連接點出有連續的曲率。樣條函數就是由此抽象而來。
數學上將具有一定光滑性的分段多項式稱爲樣條函數。具體地說,給定區間[a,b][a,b]的一個劃分Δ:a=x0<x1<...<xn1<xn=b\Delta:a=x_{0}<x_{1}<...<x_{n-1}<x_{n}=b
如果函數S(x)S(x)滿足:
(1) 在每個小區間[xi,xi+1][x_{i},x_{i+1}](i=0,1,...,n1i=0,1,...,n-1)上S(x)S(x)mm次多項式;
(2) S(x)S(x)[a,b][a,b]上具有m1m-1階連續導數。
則稱S(x)S(x)爲關於劃分Δ\Deltamm次樣條函數,其圖形爲mm次樣條函數曲線。

3 插值方法應用實例

郵輪的零件外形根據工藝要求由一組數據(x,y)(x,y)給出(在平面情況下),使用3D打印機智能沿xx方向和yy方向走非常小的一步,這就需要從已知數據得到加工所要求的步長很小的(x,y)(x,y)座標。下標給出了部分離散點,請根據下表中的離散點繪製yy關於xx的連續函數圖像。

xx 0 3 5 7 9 11 12 13 14 15
yy 0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6

實現代碼:
python代碼如下所示:

import numpy as np
from scipy import interpolate
import pylab as pl


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];


x=np.linspace(0,15,151)


for kind in ["nearest","zero","slinear","quadratic","cubic"]:#插值方式
    #"nearest","zero"爲階梯插值
    #slinear 線性插值
    #"quadratic","cubic" 爲2階、3階B樣條曲線插值
    f=interpolate.interp1d(x0,y0,kind=kind)
    # ‘slinear’, ‘quadratic’ and ‘cubic’ refer to a spline interpolation of first, second or third order)
    ynew=f(x)
    pl.plot(x,ynew,label=str(kind))

pl.legend(loc="lower right")
pl.show()

代碼運行結果如下所示:
在這裏插入圖片描述matlab代碼如下所示:

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];

x = 0 : 0.1 : 15;                   %此處實現了015,步長0.1的序列x
y1 = interp1(x0, y0, x);            %對序列x0於y0進行interp1,默認爲linear線性插值
y2 = interp1(x0, y0, x, 'spline');  %立方樣條插值
pp1 = csape(x0, y0);                %調用csape函數
y3 = fnval(pp1, x);                 %三次樣條插值
pp2 = csape(x0, y0, 'second');      
y4 = fnval(pp2, x);                 
[x', y1', y2', y3', y4']            
subplot(1,3,1)                      
plot(x0, y0, '+', x, y1)            
title('Piecewise linear')           
subplot(1, 3, 2)                    
plot(x0, y0, '+', x, y2)            
title('Spline1')                    
subplot(1, 3, 3)                    
plot(x0, y0, '+', x, y3)            %繪製二維圖形
title('Spline2')    

代碼運行結果如下所示:
在這裏插入圖片描述

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