插值問題詳解
注明出處:http://www.cnblogs.com/duye/p/8671820.html
1.
我在具體的應用(如數學建模競賽)中,常常需要根據已知的函數點進行數據、模型的處理和分析,而通常情況下現有的數據是極少的,不足以支撐分析的進行,這時就需要使用一些數學的方法,“模擬產生”一些新的但又比較靠譜的值來滿足需求。一般來說,我可以去調用MATLAB或者Python的一些庫函數來實現,這個功能就是“插值”。然而這有個非常讓我苦惱的問題,我可以從手冊上知道這個函數實現“三次多項式插值”,那個函數實現“樣條插值”.......但究竟在什么情況下使用何種插值方法呢?若不對插值方法做深入的學習,這個疑團恐難以解開。
於是,在這個原因驅動之下,我決定對常見、常用的插值方法比較深入的學習一下。我希望讀者也是基於這個原因來讀這篇文章,希望我的總結能對你有所幫助。
2. 插值
簡單講,插值就是根據已知數據點(條件),來預測未知數據點值得方法。具體來說,假如你有n個已知條件,就可以求一個n-1次的插值函數P(x),使得P(x)接近未知原函數f(x),並由插值函數預測出你需要的未知點值。而又n個條件求n-1次P(x)的過程,實際上就是求n元一次線性方程組。
代數插值
代數插值就是多項式插值,即所求插值函數為多項式函數:
顯然,系數a0.....an為所求。如果已知n+1個條件,需要n+1個方程組如下:
這時,便可以用待定系數求解。
一、泰勒插值
首先需要回顧泰勒多項式:
余項:
滿足n階可導這個條件實在是太苛刻,導致實際上泰勒插值並不常用,下面介紹拉格朗日插值與牛頓插值,這兩種方法在本質上是相同的。
二、拉格朗日插值
上面引論中提到,一般來說多項式插值就是求n-1個線性方程的解,拉格朗日插值即是基於此思想。拉格朗日創造性的避開的方程組求解的復雜性,引入“基函數”這一概念,使得快速手工求解成為可能。
DEF:求作<=n 次多項式 pn(x),使滿足條件pn(xi)= yi,i = 0,1,…,n.這就是所謂拉格朗日( Lagrange)插值
先以一次(線性)為例,介紹基函數方法求解,再推廣到任意次多項式:
已知x0,x1;y0,y1,求P(x)= a0 + a1x,使得P(x)過這兩點。則顯然:
下面介紹基函數的一般形式:
對於要求的插值函數P(x),可以證明,均可以化簡為以下形式:
要使得:
則要求:
從而基函數表為:
從而,給出基函數的一般形式為:
簡而記之:
此即著名的拉格朗日插值公式。
余項:
可以由羅爾定理(高數講過的定理,忘記請自行google)等證明,拉格朗日插值的余項為:
值得注意的是,拉格朗日插值的方法,在插值區間內插值的精度遠遠大於區間外的精度,故一般說,區間外,拉格朗日插值是不准確的。
三、牛頓插值
牛頓插值本質上和朗格朗日插值無異,但為什么牛頓也要提出這么一種插值方法呢?這是因為,拉格朗日插值每增加一個新節點,都要重新計算,換言之,它不具備承襲性。牛頓經過嚴密的推導,總結了下列具有承襲性的插值方法。為理解牛頓插值公式,需先了解下面的概念:
1) 差商是什么
DEF:設有函數f (x)以及自變量的一系列互不相等的x0, x1,…, xn(即在i ¹ j時,x i¹ xj)的值 f(xi),稱
為f (x)在點xi , xi處的一階差商,並記作f [xi , xj]。又稱
為f (x)在點xi, xj, xk處的二階差商;稱:
為f (x)在點x0, x1,…, xn處的n階差商。
根據定義得到差商表如下:
差商具有許多優美的性質,如對稱性等,這里不做更多說明。
2) 差商形式的牛頓插值公式
根據上述差商定義,自然得到下面的差商公式表:(即把差商定義式展開)
從而,把后一項不斷的代入前一項,就得到:
把最后一項去掉,作為余項(因其含有未知的x),就得到牛頓插上公式:
可以證明,這是關於x的n次多項式。
對於余項上面已經提到。
3) 牛頓插值與拉格朗日插值的比較
設拉格朗日插值函數為P(x),牛頓插值函數為N(x),顯然二者均滿足:
P(xi) = N(xi) = f(xi);
由代數多項式插值的唯一性(本質都在解最開始提到的方程),顯然有:
P(x) = N(x);
因而,兩個插值方法的余項也是相等的。這很有意思,兩個余項風格迥異,形式完全不同,卻證明了其相等。
當增加一個節點時,對於拉格朗日插值,必須摒棄前面的所有計算去重新計算,而牛頓插值公式卻告訴我們,增加的節點只需要在其后再加一項。這種承襲性使得牛頓插值再某些情境下會比拉格朗日插值更加靈活易用。另外還需說明一點,計算余項時,牛頓插值公式余項由於不需要導數,故f(x)是由離散點或者導數不存在時仍然適用,這是拉格朗日余項計算所不能比擬的。
4) 差分與牛頓插值(簡介)
差分概念請自行google。
當給出的節點等距時,使用差分能達到更優的效果,其計算更加簡便。由於原理與上述基本相同,這里不做贅述。
四、埃爾米特插值(Hermite)
有時候,我們不僅要求插值函數在給定節點上函數值重合,而且要求若干階導數也重合;即:要求插值函數φ(x)滿足:
下面介紹兩點三次Hermite插值。
已知:x0,x1;f(x0)= y0,f(x1) = y1;f’(x0) = y0’,f’(x1) = y1’;
求解:
模仿拉格朗日多項式的思想:
設
將插值條件帶入可得:
以α0為例:
同理可得α1;
對於β0:
同理得β1;
因此,得到插值公式如下:
同理可得余項為:
NOTICE: 這里也有一個小小的技巧,導數的次數以及階乘元就是你得到的條件的個數(這里是4個),而后面的連乘就是(x-xi),至於次數,每個xi用到了幾個條件,自然是幾次。這里不做證明,但事實上,這是快速寫出余項的好方法。
一般情況下的埃爾米特插值公式:
根據上述計算思想,這里給出一般的公式:
n+1個節點,唯一確定2n+1次埃爾米特插值多項式:
余項為:
這就是埃爾米特插值問題。然而這有個問題,我們實際操作上並不可能得到每一個節點處的導數值,換言之,這種方法中看不中用!我將在后面的樣條插值做更詳細的闡述。
分段差值
什么是分段差值?
簡而言之,分段差值就是對每一個分段區間(xi,xi+1)分別進行插值,則最后所得插值函數為一分段函數。
為什么用分段差值?
看一經典的例子:
在[-5,5]上,對函數f(x) = 1/(1+x^2)進行多項式插值,隨着次數的增高,可以看到雖然與原函數重合的點越來越多,可以在端點附近抖動越大,這稱為Runge現象。如下圖:
在這種原因下,誕生了更加常用的使用分段插值。
一、分段線性插值
什么是分段線性插值?
在每個區間[xi,xi+1]上,用1階多項式 (直線) 逼近 f (x):
根據前面的拉格朗日插值,在每個區間[xi,xi+1]上得:
圖示如下:
余項:
R(x) = f''(x)/2! * (x-xi)(x-xi+1) <= (xi+1-xi)^2/8 *max(|f''(x)|);
二、分段三次(埃爾米特)插值
分段差值簡單易行,又克服了Runge現象,但它卻導致一階導數不連續,有時候這可是不能容忍的!為了克服線性插值一階導數不連續的缺點,可以采取下面的分段Hermite插值。
對於每一個區間,如果不僅僅知道端點處的函數值f(xi-1)、f(xi),還知道f‘(xi-1)、f’(xi),那么我們就有四個條件,自然可以進行三次插值。
求解方法:
1. 可以基於承襲求解。即基於兩點求拉格朗日插值,由此構造,並根據導數條件求出未知系數。
2.埃爾米特方法。前面已經提到,這里不做贅述。
三、樣條插值(主講常用的三次樣條插值)
前面的分段插值,本質上還是多項式插值。如果采用分段多項式插值, 則由於插值基函數只是局部活躍(它們的支集是局部緊致的), 結點上的誤差可以被控制在小的范圍內, 因而也帶來了內在的高度穩定性. 這是分段插值的一大優勢。
許多實際問題希望插值函數具有較高階的整體光滑性. 此時, 高次Hermite插值或分段高次Hermite插值可以利用(注意:分段高次Lagrange插值和Newton插值等是做不到的,在插值結點上它們只能保證插值函數連續)。
但是,對於埃爾米特插值,必須知道每一個點的導數,在實際應用中這顯然是不現實的,實際上這種求解也是中看不中用的。樣條插值應運而生,解決了這個問題,並在各個領域大展身手,可以說是插值方法的里程碑。
什么是樣條插值?
簡而言之,就是依然對每一個小區間進行插值,但是我們不需要依賴於導數的已知;由於我們要做的就是使得端點出滿足某種條件的光滑(一般來說,三次樣條插值就是要滿足二階導數連續),根據這個要求,我們就可以在未知導數的情況下推導出樣條函數。具體方法看下面。
樣條函數的確定?
N個區間上,每個區間求三次樣條插值函數,顯然一共需要4n個條件。
1. 顯式條件:
則n個區間各有2個條件,共2n個。
2. 隱式條件:
三次樣條插值,一次導數連續且二次導數連續,即滿足:
這樣,n個區間可以找出n-1對導數相等條件。至此,可以找出2n+2(n-1) = 4n-2個條件。
3. 邊界條件:
一般來說,在整個插值區間[a,b]上,會對邊界[a,b]端點有狀態的要求。這就是邊界條件,有了這兩個邊界條件,就得到了需要的4n個條件。
邊界條件一般有三種:
1) 一階條件
即,給出端點處的一階導數值。
2) 二階條件
即,給出端點處的二階導數值。
3) 循環(周期)條件
即,f(x)是一個周期函數時,端點a,b處的一階導數值、二階導數值分別相等。
確定了樣條函數后,下面講下具體的求解。
樣條函數的計算?(二次的方法)
設分段樣條函數s(x)在0到n個節點處的二階導數值,為:
積分,得:每一區間上的樣條函數 :
對於引入的兩個常數c1,c2,使用兩個邊界條件,自然可以求解得到:
對所有區間,整理后得到關於Mj-1,Mj,Mj+1的方程:
其中:
這稱作“三彎矩方程”。
最終,由着n-1個方程,再加兩個邊界條件(這里我使用一階條件),直接帶入,聯立n+1個方程,得到:
至此,樣條插值變為求解此矩陣形式的方程組。
可以看到,系數矩陣嚴格對角占優,矩陣可逆,方程組存在唯一解,從而可以解出M0…Mn。而此方程組的解法並不困難,計算非常快捷。
總結
這就是常見、常用的插值方法及其原理,如果有必要,我會對每個方法給出源碼實現(不借助第三方庫)並告訴你在MATLAB或者Python中如何快速的使用它們。這篇文章就寫到這了,希望通過這篇文章你能對插值有更加深刻的認識並對你的學習和應用有所幫助。



























