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

高斯求積法:最佳取點

牛頓-柯特斯法把取樣點均勻擺好,再問能造出多好的規則。高斯求積法則把問題反過來:讓取點本身也成為未知數,於是冒出一頓驚人的免費午餐——n 個巧妙安置的點,能把每一個次數直到 2n-1 的多項式積得分毫不差,相同的函數計算次數卻換來大約兩倍的精度。

藏在取樣點裡的免費午餐

你到目前為止見過的每一個求積規則,都把一個積分近似成函數值的加權和:f 在 [a, b] 上的積分被換成 w_1 f(x_1) + w_2 f(x_2) + ... + w_n f(x_n)。在上一篇的牛頓-柯特斯規則裡——梯形法、辛普森法和它們的親戚——取點 x_i 是事先固定的,均勻分布在整個區間上,只有權重 w_i 由你來挑。用 n 個均勻取點,你能符合每一個次數約到 n-1 的多項式(對稱的辛普森家族再多一點)。那看起來就是全部的遊戲了。其實不是。

這裡有個開創了一整門學問的想法。取點為什麼非得固定不可?把位置 x_1, ..., x_n 也當成未知數。現在你有 2n 個旋鈕可以轉——n 個權重加 n 個位置——而不只是 n 個。一個規則有 2n 個自由參數,所以靠一個簡單的計數論證,你應該能讓它對「擁有 2n 個自由係數的函數族」精確:也就是次數直到 2n-1 的多項式,它們恰好有 2n 個係數(1, x, x^2, ..., x^{2n-1})。這就是高斯求積法的承諾:n 個最佳安置的點,把每一個次數不超過 2n-1 的多項式積得零誤差。兩點達到 3 次;三點達到 5 次;五點達到 9 次。

為什麼最佳取點是某個特殊多項式的根

祕密在於一個美麗的事實:最佳取點並非隨意——它們是某個正交多項式的根。在標準區間 [-1, 1] 上工作(任何 [a, b] 都能用線性換元映到它上面)。相關的族是勒讓德多項式 P_0, P_1, P_2, ...,其中 P_n 的次數是 n,而這個族是正交的:P_m 乘 P_n 在 [-1, 1] 上的積分,只要 m 不等於 n 就為零。把你的 n 個取樣點恰好放在 P_n 的 n 個根上——它們全落在 (-1, 1) 之內——再選好對應的權重,2n-1 次的魔法就自動掉出來。這就是高斯-勒讓德求積法

正交性為何能成事,值得親眼一看,因為它就是整台引擎。取任何次數直到 2n-1 的多項式 f。用 P_n 去除它:f = q P_n + r,其中商 q 和餘式 r 的次數各自至多 n-1。積分。含 q P_n 的那一項消失——這正是正交性的陳述,因為 q(次數 < n)是 P_0, ..., P_{n-1} 的組合,每一個都與 P_n 正交。於是 f 的真積分等於單獨 r 的積分。同時,在每個取樣點 x_i 上我們有 P_n(x_i) = 0(取點就是它的根!),所以 f(x_i) = r(x_i):規則根本看不到 q P_n 那一部分。真積分和規則都歸結到同一個 n-1 次的餘式 r,而一個 n 點規則對它是精確的。因此誤差為零。這兩個事實——正交性在真積分裡殺掉商,根在求和裡殺掉商——完美地扣在一起。

Gauss-Legendre nodes/weights on [-1, 1]:

  n = 1:  x = 0                        w = 2
  n = 2:  x = +-0.5773502692 (=+-1/sqrt3)
          w =  1, 1
  n = 3:  x = 0, +-0.7745966692
          w =  8/9, 5/9, 5/9

exact for all polynomials up to degree 2n-1.

map [-1,1] -> [a,b]:   t = (a+b)/2 + (b-a)/2 * x
  integral_a^b f dt  ~=  (b-a)/2 * sum_i w_i f(t_i)

weights are always positive and sum to 2 (the length of [-1,1]).
前幾組高斯-勒讓德取點與權重、把它們搬到一般區間 [a, b] 的線性映射,以及那個讓人安心的事實:權重全為正——這使規則在數值上保持穩定。

它替你買到什麼,又要付什麼代價

回報極為戲劇化。在相同的函數計算次數下,一個 n 點高斯規則通常把一個 n 點牛頓-柯特斯規則的誤差殲滅掉。一個小小的演算範例:把 f(x) = x^4 從 -1 積到 1,精確值是 2/5 = 0.4。兩點高斯規則在 +-1/sqrt(3) 取樣、權重各為 1,得到 1*(1/sqrt3)^4 + 1*(-1/sqrt3)^4 = 2*(1/9) = 2/9……這不是 0.4,因為 4 次超過了 2*2-1 = 3,所以兩點搆不到它。加到三點(精確到 5 次),規則就把 0.4 算到最後一位數。牛頓-柯特斯要符合一個平滑被積函數到相同精度,得用多得多的均勻取點。

還有兩個實務上的優點。第一,權重全為(不像高階牛頓-柯特斯,它的權重會變負並災難性地放大捨入誤差)。正權重意味著規則無法放大你那些 f(x_i) 值裡的浮點誤差——即使在高階也保持數值上守規矩。第二,高斯規則躲過了龍格現象:因為它的取點朝區間兩端聚集(而非均勻鋪開),它的行為就像在那種「聚集型取點」上做內插,而那正是馴服「毀掉高次均勻規則的狂野振盪」的取點。在這裡,高階是真的能用的。

高斯法在眾規則中的定位,與它的極限

高斯求積法並非永遠是對的選擇,認識它的對手很值得。一個麻煩:n 點的取點和 n+1 點的取點毫無共通,所以如果 5 點的估計不夠準,你 7 點的重試就得把五個舊的計算全部丟掉、重頭開始。當每次算 f 都很貴時,這很浪費。修法是用一個嵌套的族。克倫蕭-柯蒂斯求積法用切比雪夫點,在加密時重用舊樣本,對許多平滑函數與高斯法不相上下;而高斯-克朗羅德對則在高斯規則上恰好添入額外的點,好讓兩個估計之間那個算起來便宜的差,充當一個內建的誤差量尺。

那個內建的誤差估計,正是下一篇主題的種子——其實是下一級的:一個自適應求積法常式在一個區間上施行高斯-克朗羅德對,讀出誤差估計,若太大,就把區間一分為二並遞迴——在 f 抖動處密集地花取點,在它平靜處稀疏地花。這跟本級稍早的理查森外推法與龍貝格法是同一種精神:別盲目選定解析度,讓方法量測自己的誤差、自行加密。一個現代函式庫的積分器(多數科學軟體背後的 QUADPACK 常式),正是一台自適應的高斯-克朗羅德引擎。

現在來談那道硬牆,以及本級反覆出現的教訓。這些規則回傳的每一個數都是近似值,在浮點數裡算出來——那裡 0.1 沒有精確的二進位形式,一串長和也從不結合——所以即使是上面 x^4 那個理論上精確的兩點高斯答案,也帶著末幾位裡幾個單位的捨入而來。更要緊的是,這一切都活在一維裡。高斯求積法的超能力是「次數」,而次數對抗維度詛咒幾乎買不到什麼:一個 n 點的一維規則,在 d 維裡變成一張 n^d 點的網格,所以每軸 20 點,在十維裡就是 20^10、約十兆次計算。過了寥寥數維,你就得徹底拋棄網格、轉向蒙地卡羅積分——它 O(1/sqrt(N)) 的誤差慢得磨人,但關鍵在於:它不在乎到底有多少維。高斯法擁有平滑的低維積分;隨機性擁有高維的那一個。