JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

龍格現象:當取更多點反而更糟

常識說:資料點越多,曲線一定越貼近原函數。然而對一個惡名昭彰的鐘形函數、在等距節點上插值時,情況卻完全相反:把次數一路調高,多項式會在兩端甩出狂野的振盪而「發散」。這裡解釋為什麼誤差公式會放任這件事發生,以及兩帖乾淨俐落的解藥。

一個打破直覺的實驗

你剛學會如何穿過一組點建出唯一的插值多項式——用 拉格朗日形式 或透過 牛頓差商——也看過那條 誤差公式,它告訴你誤差最多能有多大。於是下一步很自然:要把一個函數釘得很準,就多撒一些點。點越多、次數越高、誤差越小。這就是 多項式插值 那套樂觀的說法。麻煩在於,在等距點上、對某些看起來人畜無害的函數,這套說法根本就是錯的。

經典的測試案例是龍格(Carl Runge)在 1901 年提出的函數 f(x) = 1 / (1 + 25 x^2),定義在區間 [-1, 1] 上。它平滑、溫和,中間就一個工整的鐘形——毫無戲劇性。把它在等距節點上插值,再看著你逐步加點時會發生什麼事。次數 5 時,貼合粗糙但還算合理。次數 10 時,多項式開始在 x = -1 與 x = +1 附近搖晃。次數 20 時,那些端點處的搖晃已長成高聳的尖刺:多項式在最外側節點之間的區域裡,先把真值超射數十倍,再俯衝到零以下。加點讓它更糟。糟得多。

為什麼誤差公式會放任它

回想上一篇的誤差公式。在某點 x,次數為 n 的插值多項式與真值 f 的差為 f(x) - p_n(x) = f^{(n+1)}(c) / (n+1)! 乘上節點多項式 omega(x),其中 omega(x) = (x - x_0)(x - x_1)...(x - x_n) 是對所有節點取的連乘積,而 c 是區間裡某個藏起來的點。要讓誤差隨 n 增大而消失,這三塊的乘積就必須縮小。分母裡的階乘 (n+1)! 幫了大忙。但另外兩個因子可以激烈反撲。

第一個問題:導數。對龍格函數而言,高階導數 f^{(n+1)} 爆炸性增長——大約像 25 的(導數階數)次方那麼大,這要歸功於分母裡的 25 把函數的極點(在複數平面上的 x = +/- i/5)推到非常靠近實數區間。這種增長可以跑贏階乘。第二個問題:節點多項式 omega(x)。在等距節點上,omega(x) 在中央附近很小,卻在兩端附近暴漲——它在最外側節點之間的峰值會隨 n 指數增長。把一個暴漲的導數乘上一個暴漲的 omega,再除以一個在這場賽跑裡落敗的階乘,端點區域的誤差就會無界地增長。

所以 龍格現象 不是一個數值算術上的臭蟲——它是關於那個「精確」插值多項式的一個真實事實。即使用完美的實數算術,它照樣會發生。(在真實機器上它還會挨第二記、各自獨立的傷:天真插值背後那個等距范德蒙系統病態得離譜,所以光是算出係數就會掉很多位數——但就算把條件數修好,發散依舊成立。)這個教訓可推而廣之:等距、高次的多項式插值很脆弱,你只該在低次時才動用它。

f(x) - p_n(x) = [ f^{(n+1)}(c) / (n+1)! ] * omega(x)

omega(x) = (x - x_0)(x - x_1) ... (x - x_n)

  equispaced nodes : omega peaks BLOW UP near the ends  (bad)
  Chebyshev nodes  : omega is EQUI-OSCILLATING, tiny everywhere (good)
三個互相角力的因子。解藥就是選擇能馴服 omega(x) 的節點。

解藥一:別再用等距節點

omega(x) 在端點區域的峰值就是元兇,而它們直接來自「等距節點」這個選擇。那就換節點。這個絕妙的點子——也就是本級第 5 篇的主題——是把節點更密地堆向兩端,正好堆在麻煩所在之處。最佳的堆法由 切比雪夫節點 給出:把半圓上的等距點投影下來到區間上,使它們在 +/- 1 附近聚集,例如 x_k = cos(k pi / n)。用這些節點,omega(x) 在端點不再暴漲;取而代之的是它「等振盪」,在整個區間上保持又小又均勻。

回報極為戲劇化。把一模一樣的龍格函數在切比雪夫節點上插值,誤差如今隨加點而平滑縮小,一路快速收斂直到兩端。在等距節點上飆向災難的那個次數 20 多項式,在切比雪夫節點上把鐘形貼得漂漂亮亮。函數沒有變;變的只是你在哪裡取樣。這是整個學科裡最低調卻最深刻的事實之一:你「在哪裡看」和你「看多少」一樣重要。

解藥二:把次數壓低,再把小段縫起來

另一條逃生路線乾脆完全拒絕玩高次的遊戲。不要在整個區間上用一個高聳的多項式,而是鋪下許多低次的小段——在每個小子區間上用一條不同的三次多項式——再把它們平滑地縫起來。那就是 三次樣條,也就是下一篇的主題。因為沒有任何單一小段是高次的,驅動龍格現象的那種 omega 暴漲根本沒機會啟動。樣條在等距資料上能可靠收斂,這正是為什麼真正畫過你那些點的,是樣條、而不是高次多項式,是你繪圖軟體實際在用的東西。

這裡有個該誠實面對的真實取捨。對一個平滑函數,全域切比雪夫插值是「譜收斂」的——比任何固定冪次的 1/n 都快,誤差像某個小於 1 的 c 的 c^n——當函數真的平滑時,這快得令人屏息。三次樣條只以 O(h^4) 收斂(h 是間距)——是多項式收斂,而非譜收斂。但樣條對你毫無要求:等距資料沒問題,你要解的矩陣良態且為三對角,而且它永遠不會暴漲。函數平滑、又能自由選節點,就拿切比雪夫;資料雜亂或網格固定,就拿樣條。

更深的寓意:插值不等於最佳逼近

龍格現象教了我們一個令人謙卑的區別。插值只堅持曲線必須打中你選的那些點;它對點與點之間的行為一字不提。最佳逼近 問的卻是那個真正有用的問題:在所有次數為 n 的多項式中,哪一個能讓「整個」區間上的最壞誤差最小?那就是 極小化極大逼近,它的答案絕不會像等距插值那樣發散。根據魏爾施特拉斯定理,總存在某個多項式序列均勻收斂到任意連續函數——失敗從來不是因為多項式本身軟弱,而只是因為選它們的方式很糟。

那個漂亮的妙語、也就是本級最後一篇會講精確的,是:切比雪夫節點插值幾乎和真正的極小化極大最佳逼近一樣好——只差一個緩慢增長的因子(勒貝格常數,對切比雪夫節點只像 log n 那樣增長,對等距節點卻是指數增長)。於是實用的食譜乾淨地浮現:如果你能選擇在哪裡取樣,就選切比雪夫節點,幾乎免費就拿到近乎最佳的精度;如果交到你手上的是固定的等距資料,就用樣條、並把次數壓低。

要提防一個常見的誤讀:「高次多項式很糟」。並非如此。在「對的」節點上的高次多項式好得很——上面那個次數 20 的切比雪夫貼合就是證明。元兇是高次時的等距網格,而不是次數本身。同一件工具,不同的人手。也別忘了整個學科那條普世的誠實:任何貼合都是近似,在真實機器上它還會帶著捨入誤差,而一條打中你所有取樣點的曲線,在點與點之間仍可能錯得離譜——所以永遠要在你「沒有」餵進去的點上測試一個候選插值多項式。