跳至內容

數值微分

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

數值微分數值方法中的名詞,是用函數的值及其他已知資訊來估計一函數導數演算法

有限差分法

最簡單的方式是使用有限差分近似。

簡單的二點估計法是計算經過(x,f(x))及鄰近點(x+h,f(x+h))二點形成割線的斜率[1]選擇一個小的數值h,表示x的小變化,可以是正值或是負值。其斜率為

此表示法是牛頓差商,也稱為一階均差

割線斜率和切線斜率有些差異,差異大約和h成正比。若h近似於0,則割線斜率近似於切線斜率。因此,函數f真正在x處真正的斜率是割線趨近切線時的差商:

若直接將h用0取代會得到除以零的結果,因此計算導數需要一些較不直覺的的方式。

同様的,切線斜率也可以用(x - h)和x二點的割線斜率近似。

另外一種二點估計法是用經過(x-h,f(x-h))和(x+h,f(x+h))二點的割線,其斜率為

上述公式稱為對稱差分,其一次項誤差相消,因此割線斜率和切線斜率的差和成正比。對於很小的h而言這個值比單邊近似還要準確。特別的是公式雖計算x點的斜率,但不會用到函數在x點的數值。

估計誤差為:

,

其中為在之間的某一點。此誤差沒有包括因為有限準確度而產生的捨入誤差

很多工程計算機都是用對稱差分來計算導數,像德州儀器(TI)的TI-82TI-83TI-84TI-85,其h=0.001[2][3]

雖然在實務十分常用,但上述二種方式的數值微分常被研究者批評,尤其是被一些鼓勵使用自動微分的研究者批評[4],因為上述的數值微分其精確度不高,若計算器精準度是六位數,用對稱差分計算導數只有三位數的精確度,而若是找到一計算斜率的函數,仍可以有幾乎六位數的精確度。例如假設f(x) = x2,用2x計算斜率有幾乎完整的準確度,而用差分近似就會有上述的問題。

利用浮點數的實際考量

在浮點數運算下,不同的造成的捨入誤差及公式誤差,只有在特定值下誤差才是最小值

若計算時使用浮點數,就需要考慮h要取到多小。若選的太小,相減之後會有大的捨入誤差,事實上整個有限差分的公式都是病態[5],若h夠小,導數不為零的情形下,在相消後會得到數值微分為零的結果[6],若h太大,計算割線斜率的結果就會更加準確,但用割線斜率估算切線斜率的誤差就更大了。

一種可以產生夠小的h,但又不會產生捨入誤差的方式是(不過x不能為0),其中最小浮點數英語machine epsilonε大約是2.2×10−16數量級。 [7]。以下是一個一個可以平衡捨入誤差和公式誤差,有最佳精確度的h

[8] (不過f"(x) = 0時不成立),而且需要有關函數的資訊。

上述的最小浮點數是針對雙精度(64-bit)變數,單精度變數在這類計算幾乎不太實用。其計算結果在二進制中不太可能是「整數」。雖然x是可以用浮點數表示的數字,但x + h幾乎不會也是可用浮點數表示(而且和x不同)的數字,因此x + h需調整為機器可讀的數字,因此會出現(x + h) - x不等於h的情形,因此用二個函數計算值計算微分時,二個位置的差不會是h。幾乎所有的十進制分數在二進制下都會是循環小數(都像1/3在十進制中的情形一様),例如h = 0.1在二進制下會是循環小數,是 0.000110011001100...。因此在浮點數下一個可能計算的方式是:

 h:=sqrt(eps)*x;
 xph:=x + h;
 dx:=xph - x;
 slope:=(F(xph) - F(x))/dx;

先計算(x + h) - x的值,再用這個值作為微分算式的分母,不過若是用電腦計算,編譯器最佳化的機能可能會認為dxh相同,因此讓上述的方式失效。若是用C或其他類似的程式語言,可以讓xph宣告成Volatile變量,以避免此一問題。

高階方法

也有用更高階估計導數的方法,或是估計高階導數的方法。

以下就是一階導數的五點法(一維下的五點模版英語five-point stencil[9]

其中.

微分求積

微分求積英語Differential quadrature(Differential quadrature)是用函數在特定位置數值的加權和來近似導數[10][11],其名稱類似數值積分中用的求積(quadrature),也就是像梯形法或是辛普森法中用的加權和,有許多方式可找出加權的係數,在求解偏微分方程式時會用到微分求積。

複變的方法

傳統用有限差分近似數值微分的方式是病態的,不過若全純函數,在實數軸上的值都是實數,可以用複數平面中靠近的位置來求值,此方式為數值穩定的方式,例如[6]一階導數可以用以下的複數導數公式計算[12]

.

上述公式只在計一階導數時有效,若要拓展到任意階導數,需要用到多重複數,結果也會是多重複數的導數。[13]

而任意階的導數可以用柯西積分公式計算:

,

其中積分會用數值積分計算。

Lyness和Moler在1967年提出用複變數來計算數值微分[14]。Abate和Dubner提出一種用複數拉普拉斯轉換的數值反演為基礎的算法[15]

參考資料

  1. ^ Richard L. Burden, J. Douglas Faires (2000), Numerical Analysis, (7th Ed), Brooks/Cole. ISBN 0-534-38216-9
  2. ^ Katherine Klippert Merseth. Windows on Teaching Math: Cases of Middle and Secondary Classrooms. Teachers College Press. 2003: 34. ISBN 978-0-8077-4279-2. 
  3. ^ Tamara Lefcourt Ruby; James Sellers; Lisa Korf; Jeremy Van Horn; Mike Munn. Kaplan AP Calculus AB & BC 2015. Kaplan Publishing. 2014: 299. ISBN 978-1-61865-686-5. 
  4. ^ Andreas Griewank; Andrea Walther. Evaluating Derivatives: Principles and Techniques of Algorithmic Differentiation, Second Edition. SIAM. 2008: 2– [2016-07-03]. ISBN 978-0-89871-659-7. (原始內容存檔於2016-07-29). 
  5. ^ Numerical Differentiation of Analytic Functions, B Fornberg - ACM Transactions on Mathematical Software (TOMS), 1981
  6. ^ 6.0 6.1 Using Complex Variables to Estimate Derivatives of Real Functions, W Squire, G Trapp - SIAM REVIEW, 1998
  7. ^ Following Numerical Recipes in C, Chapter 5.7頁面存檔備份,存於網際網路檔案館
  8. ^ p. 263 [1]頁面存檔備份,存於網際網路檔案館
  9. ^ Abramowitz & Stegun, Table 25.2
  10. ^ Differential Quadrature and Its Application in Engineering: Engineering Applications, Chang Shu, Springer, 2000, ISBN 978-1-85233-209-9
  11. ^ Advanced Differential Quadrature Methods, Yingyan Zhang, CRC Press, 2009, ISBN 978-1-4200-8248-7
  12. ^ Martins, JRRA; Sturdza, P; Alonso, JJ. The Complex-Step Derivative Approximation. ACM Transactions on Mathematical Software. 2003, 29 (3): 245–262. doi:10.1145/838250.838251. CiteSeerX: 10.1.1.141.8002可免費查閱. 
  13. ^ 存档副本 (PDF). [2012-11-24]. (原始內容 (PDF)存檔於2014-01-09). 
  14. ^ Lyness, J. N.; Moler, C. B. Numerical differentiation of analytic functions. SIAM J.Numer. Anal. 1967, 4: 202–210. doi:10.1137/0704019. 
  15. ^ Abate, J; Dubner, H. A New Method for Generating Power Series Expansions of Functions. SIAM J. Numer. Anal. March 1968, 5 (1): 102–112. doi:10.1137/0705008. 

相關條目

外部連結