1 插值方法的基本概念:
在實際問題中,一個函數往往是通過實驗觀測得到的,僅已知函數在某區間上一系列點上的值:。
當需要在在這些節點之間的點上的函數值時,常用較簡單的、滿足一定條件的函數去代替,插值法是一種常用方法,其插值函數滿足條件:
。
2 三種插值方法及其基本理論
2.1 分段線性插值
將每兩個相鄰的節點用直線連起來,如此形成的一條折線就是分段線性插值函數,記作: ,它滿足,且在每個小區間上是線性函數 。
可以表示爲,其中:
有良好的收斂性,即對於,有。
證明:
對於和兩點,根據直線兩點式,我們有:
得證
2.2 拉格朗日插值
2.3 樣條插值
樣條函數的概念:
樣條(Spline)本來是工程設計中使用的一種繪圖工具,是富有彈性的細木條或金屬條。繪圖員利用它把一些已知點連接成一條光滑曲線(稱樣條曲線),並使連接點出有連續的曲率。樣條函數就是由此抽象而來。
數學上將具有一定光滑性的分段多項式稱爲樣條函數。具體地說,給定區間的一個劃分
如果函數滿足:
(1) 在每個小區間()上是次多項式;
(2) 在上具有階連續導數。
則稱爲關於劃分的次樣條函數,其圖形爲次樣條函數曲線。
3 插值方法應用實例
郵輪的零件外形根據工藝要求由一組數據給出(在平面情況下),使用3D打印機智能沿方向和方向走非常小的一步,這就需要從已知數據得到加工所要求的步長很小的座標。下標給出了部分離散點,請根據下表中的離散點繪製關於的連續函數圖像。
0 | 3 | 5 | 7 | 9 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|
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; %此處實現了0到15,步長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')
代碼運行結果如下所示: