數值積分與數值微分

數值微分(numerical differentiation)

微積分把導數 f'(x) 定義為斜率的極限——縱向變化除以橫向變化——當橫向變化縮到零時的值。但電腦無法真正取極限,只能挑一個很小、有限的橫向步長,量出它給出的斜率。數值微分就是這門手藝:用少數幾個函數值估計導數,模仿那個斜率卻永遠不真正抵達極限。

最簡單的配方是前向差分:取小步長 h,計算 (f(x + h) - f(x)) / h,也就是圖形上鄰近兩點連線的斜率。當 h 縮小,它趨近 f'(x)。你也可以向後看,(f(x) - f(x - h)) / h,或者更好地用中心差分把 x 夾在中間:(f(x + h) - f(x - h)) / (2h)。同樣的想法可延伸到二階導數:f''(x) 由 (f(x + h) - 2 f(x) + f(x - h)) / h^2 近似,這就是離散版的曲率。這些就是有限差分公式,凡是需要導數卻只有 f 的取樣值之處,都靠它們搭建。

數值微分之所以重要,是因為真實問題裡你常只有資料或一個黑箱函數,而非可以手算微分的乾淨公式:例如從記錄的位置估計速度,或在最佳化器內部估梯度。它誠實的危險很微妙、值得牢牢記住:把 h 縮得更小並不會持續改善答案。越過甜蜜點之後,兩個幾乎相等的數相減會把有效位數丟給捨入誤差,再除以極小的 h 又把這個雜訊放大——於是存在一個最佳步長,比它更小答案反而變糟。在能取得精確導數之處,自動微分可以完全避開這個陷阱。

估計 f(x) = e^x 在 x = 0 的導數(真值為 1)。前向差分取 h = 0.1 得 (e^0.1 - 1)/0.1 = 1.0517,誤差約 0.05。中心差分 (e^0.1 - e^-0.1)/0.2 = 1.00167,誤差約 0.0017——同樣的 h 卻好得多,因為它的誤差按 h^2 而非 h 衰減。

同樣的步長,精度卻天差地別:中心差分勝出。

頭號錯誤是以為 h 越小越好。在雙精度下,中心差分的最佳 h 大約是 10^-5(而非 10^-15);若把 h 壓到更小,主宰誤差的就不是截斷誤差而是抵消造成的捨入誤差,估計反而劣化。

又稱
finite-difference differentiationapproximating a derivative有限差分求導