如何直觀地理解拉格朗日插值法?

請講述一下拉格朗日插值法的直觀理解和推倒思路


之前我寫過一篇文章: 關於牛頓插值法的 ,其中解釋了什麼是插值法?為什麼要有插值法?大家對此感興趣可以去看看。

還有另外一種插值法,叫做拉格朗日插值法,也是以大牛冠名的,我們來看看它是怎麼推導的?

1 拉格朗日插值法

比如說,已知下面這幾個點,我想找到一根穿過它們的曲線:

使用多項式畫出這根曲線是完全可行的,關於這點可以參看我寫的 如何理解泰勒公式?。

我們可以合理的假設,這根曲線是一個二次多項式:

y = a_0 + a_1x + a_2x^2

這是因為有三個已知的點,可以通過下列方程組解出這個二次多項式:

 egin{cases} y_1 = a_0 + a_1x_1 + a_2x_1^2\ y_2 = a_0 + a_1x_2 + a_2x_2^2\ y_3 = a_0 + a_1x_3 + a_2x_3^2 end{cases}

不過這裡不打算通過解方程來得到這根二次曲線,我們來看看拉格朗日是怎麼解出這根曲線的?

1.1 拉格朗日的思考

約瑟夫·拉格朗日伯爵(1736 - 1813),可能是這麼思考的。

首先,肯定得是二次曲線,這個之前我們就已經說明過了。

其次,拉格朗日認為可以通過三根二次曲線相加來達到目標。那這是怎麼的三根二次曲線呢?

第一根曲線 f_1(x) ,在 x_1 點處,取值為1,其餘兩點取值為0:

為什麼這麼做?看下去就知道了。

第二根曲線 f_2(x) ,在 x_2 點處,取值為1,其餘兩點取值為0:

第三根曲線 f_3(x) ,在 x_3 點處,取值為1,其餘兩點取值為0:

這三根曲線就是拉格朗日需要的,我們來看看為什麼?

  • y_1f_1(x) 可以保證,在 x_1 點處,取值為 y_1 ,其餘兩點取值為0。
  • y_2f_2(x) 可以保證,在 x_2 點處,取值為 y_2 ,其餘兩點取值為0。
  • y_3f_3(x) 可以保證,在 x_3 點處,取值為 y_3 ,其餘兩點取值為0。

那麼:

f(x)=y_1f_1(x)+y_2f_2(x)+y_3f_3(x)

可以一一穿過這三個點,我們來看看:

拉格朗日伯爵說,看,這三根曲線就可以組成我在尋找的曲線:

真的是非常精彩的思考啊。

1.2 插值法的推導

到了嚴格化的時候了,我們用符號來表示 f_ i(x_ j),i=1,2,3,j=1,2,3

首先, f_ i 必須是二次函數。

其次,需要滿足的條件:

 f_ i(x_ j)=egin{cases} 1 i=j\ 0 i
e jend{cases}

那麼,如下構造 f_1(x) 很顯然可以滿足上述條件(代值進去就可以驗算):

displaystyle f_1(x)=frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3)}

更一般的有:

displaystyle f_ i(x)=prod _{j
e i}^{1leq j leq 3}frac{(x-x_ j)}{(x_ i-x_ j)}

因此,最終我們得到:

displaystyle f(x)=sum _{i=1}^3 y_ if_ i(x)

這就是拉格朗日插值法。上面的思路要推廣到更多點的插值也非常容易。

牛頓插值法的 也是多項式插值法,拉格朗日插值法也是多項式插值法,那麼,兩者得到的多項式是否是同一個多項式?

2 拉格朗日插值法、牛頓插值法、范德蒙行列式

要回答剛才提出的問題,得看看我們最早提出的方程組怎麼解?

 egin{cases} y_1 = a_0 + a_1x_1 + a_2x_1^2\ y_2 = a_0 + a_1x_2 + a_2x_2^2\ y_3 = a_0 + a_1x_3 + a_2x_3^2 end{cases}

(x_1,y_1),(x_2,y_2),(x_3,y_3) 這三個點是已知的,所以上面實際是一個線性方程組:

 underbrace{egin{pmatrix} y_1 \ y_2 \ y_3 end{pmatrix}}_{vec{y}}=underbrace{egin{pmatrix} 1  x_1  x_1^2 \ 1  x_2  x_2^2 \ 1  x_3  x_3^2 end{pmatrix}}_{A}underbrace{egin{pmatrix} a_0 \ a_1 \ a_2 end{pmatrix}}_{vec{a}}

簡寫就是:

vec{y}=Avec{a}

A 就是所謂的范德蒙矩陣, |A| 自然就是范德蒙行列式。

根據 矩陣與線性方程組解的關係 ,如果 |A|
e 0 ,那麼此方程就只有唯一的解,自然牛頓插值法、拉格朗日插值法得到的就是同一根多項式曲線。

求一下 |A| ,先把 r_2-r_1,r_3-r_1 ,得到( r_1 表示第一行,以此類推。這麼做是不會改變行列式的值的):

egin{align*} |A| =egin{vmatrix} 1  x_1  x_1^2 \ 0  x_2-x_1  x_2^2-x_1^2 \ 0  x_3-x_1  x_3^2-x_1^2 end{vmatrix}\  =egin{vmatrix} x_2-x_1  x_2^2-x_1^2 \ x_3-x_1  x_3^2-x_1^2 end{vmatrix}\  =(x_3-x_1)(x_3-x_2)(x_2-x_1) end{align*}

從給出的三個點來看, x_1,x_2,x_3 都不相等,所以 |A|
e 0

所以,牛頓插值法、拉格朗日插值法得到的是同一根多項式曲線。


數學教材的一大特點是不說人話,勸退率比較高。

其實嚴謹點兒的確是好事兒,但太嚴謹了會導致可讀性降低,反倒本末倒置。

所以我個人感覺,學數學這玩意兒最好一門分出兩本教材出來。一本不太嚴謹的給萌新用,另一本嚴謹的用作進階補遺用。

不然的話,除了把數學搞成少數精英的遊戲外,毫無助益。我們要精英,但我們也需要推廣普及。

先說插值法。插值法是做什麼用的?插值法是通過已知點,求過這些點的未知函數的數學方法。

所以我們輸入的,是一堆點,也就是一堆x一堆y

我們想要得到的,是一個函數,這個函數能完美的通過一堆x這一堆y

那你要怎麼解決這個問題呢?說白了很簡單,就是一個開開關的問題。

這就是拉格朗日插值法的想法。

比如說我給你三個點,讓你求出一條過這三個點未知函數。只要是函數,就能寫成y=f(x)型。

那這三個點肯定要滿足這個條件(廢話這是題設給的):

第一個點的y=f(第一個點的x)

第二個點的y=f(第二個點的x)

第三個點的y=f(第三個點的x)

這函數可能實現嗎?可能。我們可以用這種開開關的方式來實現他。

我們都知道數學裡面有一個小學生都知道的道理:0乘任何數都是0,1乘任何數都不變。

感覺很蠢對吧。但這就是拉格朗日插值法的精髓所在:我們想辦法對每個x構建一個「開關」;當x為指定條件的x值時,把指定條件的x值的「打開」(置為1),把其餘非指定條件的x值的開關「關上」(置為0)。這樣的話,我們做一個簡單的加和,就能讓函數輸出我們想要的y值,進而得出這未知的函數了。

這「開關」的學名叫什麼?就叫插值基函數

所以我們用這個看上去特弱智的方法,來解決問題。做拉格朗日插值:

第N個點的y = 基函數1×第1個點的y + 基函數2×第2個點的y + 基函數3×第3個點的y

假如說我們想在這個函數中,讓 第2個點的y=f(第2個點的x),那麼就有:

第N個點的y(N取2) = 基函數1【關閉】×第1個點的y + 基函數2【打開】×第2個點的y +基函數3【關閉】×第3個點的y

我們一開始就假設了,基函數【關閉】的時候就是0,基函數【打開】的時候就是1。

換句話就是:

第N個點的y(N取2) = 0×第1個點的y + 1×第2個點的y + 0×第3個點的y

第N個點的y(N取2) = 第2個點的y

可見這個函數運作正常。

那麼接下來就是這個「開關」的問題了。這個「開關」要怎麼構建呢?

我們又想到一個特別弱智的方法(沒錯,數學很簡單,你不要把他想複雜了):

——任何數除自己都是1,零除任何數都是0。

那麼我們可以把各個「開關」分別寫出來,以第二個開關為例:

基函數狀態=(輸入X-第一個點的x)(輸入X-第三個點的x) / (第二個的點x-第一個點的x)(第二個點的x-第三個點的x)

你自己算一下,就會發現這個基函數構造的很有趣。

——當你輸入X值為第一個,第三個點的x值時,你會發現分子直接等於0,於是「開關關閉」,基函數的值為0。

——當你輸入X值為第二個點的x值時,你會發現分子分母是相同的,於是「開關打開」,基函數的值為1。

所以我們最後總結一下,拉格朗日插值法是怎麼做出來的?

先給定三個點(x1,y1),(x2,y2),(x3,y3),構造函數:

拉格朗日插值函數= 開關1×y1 + 開關2×y2 + 開關3×y3

其中標黑y1y2y3都是已知值。只需求三個「開關」的表達式即可。

而相應的「開關」表達式為:

第N個開關 = (未知量X-一個非N處值x)(未知量X-另一個非N處值x) / (N處值x-一個非N處值x)(N處值x-另一個非N處值x

其中標黑的N處值x非N處值x都是已知值。分別求出三個開關的表達式,並帶回原式。至此,整個函數就變成了一個y=f(x)型,拉格朗日插值法結束。

這種「開開關」的想法,就是拉格朗日插值法的思路了。

當然最後還要補充一點,答主前文所說的「簡單」「弱智」,都是為了讓讀者放鬆心態用的。很多看似很簡單的數學工具的建立,是不費盡一番心血無法達成的。學數學的時候,要戰略上藐視敵人,戰術上重視敵人;同時,在學懂了這些數學工具的時候,對前人的敬仰便會油然而生,而絕不是崇拜迷信,亦或是傲慢自矜了。

以上。感謝您的閱讀。


其實互異節點插值問題中插值多項式可以被分解為一系列所謂拉格朗日插值基函數的線性和的這一點,對於低次多項式可能還能看出來(實際上,大概對於線性插值是最容易看出來的,對於二次多項式我就已經覺得不算直觀了),對於高次多項式則可能不那麼容易看出。不過利用待定係數法,我們可以發現待求的插值多項式的係數p = [a0; a1; ...; an]滿足如下方程:

Ap = y

p = [1 x1 x1^2 ... x1^n; 1 x2 x2^2 ... x2^n; ...; 1 xn xn^2 ... xn^n]

y = [y1; y2; ...; yn]

或者說

p = inv(A)*y

其中A僅於插值節點xi有關,而上面的式子說明,對於給定的插值節點,只要y發生改變,p也會相應改變。而p是插值多項式的係數,因此一個p就對應於一個n次多項式。這麼一來,我們可以把y改寫為:

y = y1*e1 + y2*e2 + ... + yn*en

其中ei是第i個元素為1、其餘元素為0的單位向量。

p = inv(A)*y = y1*(inv(A)*e1) + y2*(inv(A)*e2) + ... + yn*(inv(A)*en) = y1*p1 + y2*p2 + ... + yn*pn

其中pi正是對於插值問題

yi = y(xi) = 1, yj = y(xj) = 0, j != i

的插值多項式的係數。

因此由上式可見,我們需要求的n次多項式p,實際上可以表示為一系列n次多項式pi的線性和的形式。而這一系列的n次多項式pi,就正是拉格朗日基函數li(x)。

而且根據上面的推導我們可以發現,只要我們所需要的插值函數可以表示為一系列待定係數的線性和的形式,即插值函數可表示為

y = a1*f1(x) + a2*f2(x) + ... + an*fn(x)

的形式, 那麼就都有可能採用類似的方式把待求的插值函數表示為一系列「基函數」的線性和的形式:

y = y1*g1(x) + y2*g2(x) + ... + yn*gn(x)

其中gi(x)是對於插值問題

yi = y(xi) = 1, yj = y(xj) = 0, j != i

所求得的插值函數。只不過對於多項式插值,這個基函數可以通過考察零點的方式很方便的求得,而對於其他形式的插值函數,則未見得可以這麼方便,儘管這些基函數也僅與插值節點有關,因此在插值節點確定的情況下,可以預先求出。

當然,上面這種擴展情形必須考慮矩陣

A = [f1(x1) f2(x1) ... fn(x1); f2(x1) f2(x2) ... fn(x2); ...; f1(xn) f2(xn) ... fn(xn)]

的可逆性。


插值想解決的是在一個工程問題中,知道函數f在幾個好測點的值,能不能知道不好測的點的值?

事實上,上面這個要求真心太高了。數學上能做到的,只是弄出一個g,在那幾個好測點的值和f一樣。事實上,這樣弄出來的g,如果f有好的光滑性,g在這些好測點的附近,不會和f差太多。

g怎麼弄呢?核心是針對每一個好測點,弄一個多項式,它在這個好測點處等於f,其他好測點處等於0。這樣的話,把這一群多項式加起來作為g,就能保證f和g在好測點處一樣。


那麼問題又來了。怎麼去弄一個多項式,在一個好測點等於f,在其他的好測點等於0呢?可以直接構造出來這樣的多項式。

另一種弄出g的方法是直接令g是一個係數待定的多項式,然後根據f和g在好測點相等,解方程。這兩種方法其實並沒有什麼差別。

真用這種方法幹活的話,要注意如何正確選取好測點(其實不一定好測…),要在凹區域和凸區域上插至少3個點,感興趣的地方要多弄幾個點,總之多多益善。


小答一下,個人理解,不專業:

既然是插值,我就按插值來理解的,假如2階,3個係數,需要3個自變數點:x0,x1,x2和對應的f(x0),f(x1),f(x2),對於任何一點x我們先看x0這個點的值f(x0)對x的偏量:

x0的區間[x0,x1],[x0,x2],第一個區間內x0對x的插值:(x-x1)/(x0-x1),第二個區間內x0對x的插值:(x-x2)/(x0-x2),相乘再乘以係數f(x0)......


推薦閱讀:

如何評價國科大非數專業使用卓里奇和代數學引論?
在你學習數學時有過怎樣「頓悟」的經歷?
數學上經常說「線性代數、線性空間、……」,到底何為線性?為什麼在諸多概念中反覆強調?
為什麼要學習線性代數和高等數學?
紅綠藍三色是(唯一的)正交基嗎?

TAG:數學 | 拉格朗日J-LLagrange | 線性代數 | 高等數學 |