自適應求積(adaptive quadrature)
大多數被積函數的難度並不均勻:一個函數可能在大部分範圍幾乎平坦,卻在某個小區域劇烈尖起。固定的均勻網格在此很浪費——它在無趣的平坦處與狂野的尖峰處投入同樣的力氣。自適應求積是聰明的替代:它自動把工夫集中在被積函數「難」的地方,在容易處則輕鬆帶過。
其機制是會自我檢查的分而治之。在一片上,用兩種方式估計積分——例如一個粗法則配一個細法則,或一個高斯法則配上重用相同點的 Kronrod 擴充。兩個估計之間的差,是該片便宜的事後誤差估計。若它低於局部容差,就接受該片並前進。若否,就把該片「對半切開」並對每一半遞迴,每一半分得一份容差。這個遞迴自然會在尖峰或劇變區鑽出許多極小的片,同時讓光滑平坦的長段維持為一大片——於是最終的網格恰好在需要的地方變細。
自適應求積正是科學程式庫中通用積分常式(著名的 QUADPACK 家族、MATLAB 的 integral、SciPy 的 quad)實際所用,因為它能達到所要求的精度,而使用者無須事先知道被積函數在哪裡作怪。誠實的提醒:內建的誤差估計是啟發式的,不是保證,所以夠尖或夠振盪的被積函數可能騙過它、使它太早停(夾在取樣點之間的窄尖峰可能完全沒被看見);而真正的奇異點可能觸發無止境、無效的細分,除非常式認得它,或你先把它變換掉。
在 [0, 1] 上積 f(x) = 1/((x - 0.3)^2 + 0.0001),它在 x = 0.3 附近有一個又高又窄的尖峰。均勻網格不是錯過尖峰,就是到處浪費點;自適應常式在 0.3 周圍放一叢密集的小片,其餘地方只放幾個粗片,用少得多的總計算次數達到目標精度。
只在被積函數難的地方細化;在光滑處輕鬆帶過。
誤差估計是啟發式的,所以自適應求積可能被騙:比初始取樣間距還窄的尖峰可能永遠不被偵測,常式於是回傳一個自信卻錯誤的答案。對振盪或奇異的被積函數,請用為它們設計的方法,而非信任預設。