我們能得到一個函數f在區間[a,b]上某些點的值或者這些點上的高階導數
我們就能通過插值法去得到一個函數g,g與f是非常相近的
一般來說g分為三類,一類是n次多項式 an*xn + an-1*xn-1 + .......+a0,一類是三角多項式,最后一類是分段n次多項式
多項式插值
這個可以說是最簡單的插值了
對於an*xn + an-1*xn-1 + .......+a0,我們有n+1個未知數,我只需要知道n+1個點的函數值就可以解出這n+1個未知數
將解出的值帶入即可
優點:簡單粗暴
缺點:要解n+1個方程,時間復雜度較高,n不好確定,若n過大,容易過擬合,若n過小,容易欠擬合
拉格朗日插值
先說一階多項式
我們有兩點式
f(x) = yk*(xk+1 - x) / (xk-xk+1) + yk+1*(x-xk) / (xk+1 - xk)
此兩點式可以看做∂ * yk + (1-∂) * yk+1
那么自然的在x=xk的時候 ∂=0 在x=xk+1的時候∂=1
這里的∂其實是與x相關的一階多項式
再說二階多項式
對於一個二次函數,我們有三個點(xk-1,yk-1) ,(xk,yk) ,(xk+1,yk+1)
我們有lk-1,lk,lk+1
f(x) = lk-1*yk-1 + lk*yk + lk+1*yk+1
其中l是與x相關的二次多項式
我們可以把l當作基函數
這樣的話就有
x = xk-1 時lk-1 = 1, lk=0, lk+1 = 0
x = xk時 lk-1 = 0, lk=1, lk+1 = 0
x = xk+1時lk-1 = 0, lk=0, lk+1 = 1
那么這個插值基函數是很好求的
因為每個插值函數都有兩個零點
對於lk-1來說有零點xk,xk+1
那么lk-1就可以表示為lk-1 = A*(x-xk)*(x-xk+1)
因為x=xk-1時lk-1 = 1
所以A = 1 / ((xk-1 - xk)* (xk-1 - xk+1) )
那么同理lk和lk+1也能求出來了
那我們得到二階的拉格朗日插值多項式
現在將二階推廣到n階
得到n接的拉格朗日插值多項式
余項:
Rn(x) = f(x) - Ln(x) Rn(x)表示n次拉格朗日多項式的插值余項
Rn(x) = fn+1(e)/(n+1)! * wn+1(x) e屬於[a,b]且依賴與x wn+1(x) = (x-x0)(x-x1).......(x-xn)
優點:算法較為簡單
缺點:無法處理動態增加節點的情況
牛頓插值
還是先從一階到二階進行說明
我先得到了一階差值多項式P1(x),P1(x) 滿足過點(x1, f(x1)), (x2,f(x2))
假設現在有第三個點(x3,f(x3))我們要通過這個點去得到二階差值多項式P2(x) 使得P2(x)過這三個點
可以設P2(x) = P1(x) + a2*(x-x0)*(x-x1)
通過第三個點解出a2就行了
推廣到多階
那么可以得到Pn(x) = a0 + a1(x-x0) + a2(x-x0)(x-x1) + a3(x-x0)(x-x1)(x-x2) + ......
求這個插值多項式的值可以通過遞推一步一步的求
這樣就實現了動態增刪
可以看到計算ak需要計算(k-1)2次,那么牛頓插值法就是一個快速的計算方法
均差
一階均差 f[x0, xk] = ( f(xk) - f(x0) ) / (xk - x0)
二階均差 f[x0, x1, x2] = (f[x0, x2] -f[x0, x1] ) / (x2 - x1)
可以看到一階均差就是簡單的求斜率
二階均差就是對一階均差求斜率
那么k階均差就是
f[x0, x1,,,,,,xk] = (f[x0,,,,,xk-2, xk] -f[x0, ,,,,,,,xk-2,xk-1] ) / (xk - xk-1)
f[x0, x1,,,,,,xk] = fn(ε) / n!
均差的性質
k階均差可表示為f(x0),f(x1), f(x2),,,,,,,,, f(xk)的線性組合
牛頓插值中的a就是均差,可以從一階開始推,然后使用數學歸納法證明
那么牛頓插值多項式就是:
在計算f[x0,x1,,,,,,,,,,xn]時,一般使用均差表
均差表的計算方式為
a[i,j] = ( a[i-1][j] - a[i-1][j-1] ) / (末尾的x - 最開始的x)
誤差:
誤差為最后一階的均差 * w(x)
優點:可動態增刪節點
缺點:無法處理要求導數相同的情況
埃爾米特插值法實驗報告
一個點,多個導數:
牛頓插值中的均差在xi->x0時其實分別是i階導數,這樣就是我們熟悉的泰勒多項式
此時的插值函數就是泰勒多項式
兩個點,一個導數
我們有三個條件,也就是說我們能求出三次插值多項式
這時我們先寫出過這兩個點的牛頓插值多項式
在這個多項式的基礎上我們再加上一個三次項
搞定,可以觀察到,這三個項數其實可以算是正交的,因為當x=x1或者x=x2時最后一項是0滿足條件的
兩個點,兩個導數
這也是題目所要求的情況
因為有兩個導數,所以牛頓插值法無法解決,這里只能使用基函數方法
設插值函數為H(x), 點與導數分別為(x1,y1,m1),(x2,y2,m2)
H(x)滿足:H(x1) =y1, H(x2) = y2, H(x1)’ = m1,H(x2)=m2
H(x) = a1*x1 + a2*x2 + b1*m1 + b2*m2
其中 a1, a2, b1, b2均為三層插值多項式
X=x1時 a1(x1) = 1,a2(x1) = 0, b1(x1) = 0,b2(x1) = 0,a1’(x1) = 1,a2’(x1) = 0
X=x2時 a1(x2) = 0,a2(x2) = 1, b1(x2) = 0,b2(x2) = 0,a1’(x2) = 1,a2’(x2) = 0
X=x1時 b1’(x1) = 1,b2’(x1) = 0
X=x2時b1’(x1) = 0,b2’(x1) = 1
然后用了一個很巧妙的方法設基函數,解出來值和就是這樣子的
R3(x) = 1/4! * (x-xk)2(x-xk+1)2*f4(ε)
兩個點,兩個導數2
直接使用泰勒多項式,並把將余項改為未知數,使用多余的一個條件去求余項的值
例如:
求次數小於等於3的多項式P(x),使滿足條件
P(x0)=f(x0),P'(x0)=f'(x0),P"(x0)=f"(x0),P(x1)=f(x1)。
多個點,多個一階導數,三次
兩個點作為一個區間每個區間分別求就好啦
這樣子還保證了導數的連續性
優點:可保證一階導數連續
三次樣條插值
三次樣條插值就是使用 ax3+bx2+cx + d = 0去做擬合
一共有4個未知數,也就是說 對於每個小區間,我需要至少4個方程
假設我有n個點, 那么就一共有n-1個小區間,一共就是4n - 4個方程
因為n個點中,我們有n個點的函數值 n個方程
每個區間相鄰點函數值相等 n-2個方程
每個區間相鄰點一階導相等 n-2個方程
每個區間相鄰點二階導相等 n-2個方程
還差兩個條件
剩下的兩個條件一般為
區間兩端點的一階導已知
區間兩端點的二階導為0
那么一共是4n - 2個方程,搞定
具體解法:
這里放一個例題
優點:三次樣條插值得到的插值函數二階導,一階導均連續,此為三次樣條插值的