數值微分 是數值方法 中的名詞,是用函數的值及其他已知資訊來估計一函數 導數 的演算法 。
有限差分法
最簡單的方式是使用有限差分 近似。
簡單的二點估計法是計算經過(x ,f(x) )及鄰近點(x+h ,f(x+h) )二點形成割線 的斜率[ 1] 選擇一個小的數值h ,表示x 的小變化,可以是正值或是負值。其斜率為
f
(
x
+
h
)
−
f
(
x
)
h
.
{\displaystyle {f(x+h)-f(x) \over h}.}
此表示法是牛頓 的差商 ,也稱為一階均差 。
割線斜率和切線斜率有些差異,差異大約和h 成正比。若h 近似於0,則割線斜率近似於切線斜率。因此,函數f 真正在x 處真正的斜率是割線趨近切線時的差商:
f
′
(
x
)
=
lim
h
→
0
f
(
x
+
h
)
−
f
(
x
)
h
.
{\displaystyle f'(x)=\lim _{h\to 0}{f(x+h)-f(x) \over h}.}
若直接將h 用0取代會得到除以零 的結果,因此計算導數需要一些較不直覺的的方式。
同様的,切線斜率也可以用(x - h)和x二點的割線斜率近似。
另外一種二點估計法是用經過(x-h ,f(x-h) )和(x+h ,f(x+h) )二點的割線,其斜率為
f
(
x
+
h
)
−
f
(
x
−
h
)
2
h
.
{\displaystyle {f(x+h)-f(x-h) \over 2h}.}
上述公式稱為對稱差分 ,其一次項誤差相消,因此割線斜率和切線斜率的差和
h
2
{\displaystyle h^{2}}
成正比。對於很小的h 而言這個值比單邊近似還要準確。特別的是公式雖計算x點的斜率,但不會用到函數在x點的數值。
估計誤差為:
R
=
−
f
(
3
)
(
c
)
6
h
2
{\displaystyle R={{-f^{(3)}(c)} \over {6}}h^{2}}
,
其中
c
{\displaystyle c}
為在
x
−
h
{\displaystyle x-h}
和
x
+
h
{\displaystyle x+h}
之間的某一點。此誤差沒有包括因為有限準確度而產生的捨入誤差 。
很多工程計算機都是用對稱差分來計算導數,像德州儀器(TI)的TI-82 、TI-83 、TI-84 及TI-85 ,其h =0.001[ 2] [ 3] 。
雖然在實務十分常用,但上述二種方式的數值微分常被研究者批評,尤其是被一些鼓勵使用自動微分 的研究者批評[ 4] ,因為上述的數值微分其精確度不高,若計算器精準度是六位數,用對稱差分計算導數只有三位數的精確度,而若是找到一計算斜率的函數,仍可以有幾乎六位數的精確度。例如假設f(x) = x2 ,用2x計算斜率有幾乎完整的準確度,而用差分近似就會有上述的問題。
利用浮點數的實際考量
在浮點數運算下,不同的
h
{\displaystyle h}
造成的捨入誤差及公式誤差,只有在特定值下誤差才是最小值
若計算時使用浮點數 ,就需要考慮h 要取到多小。若選的太小,相減之後會有大的捨入誤差 ,事實上整個有限差分的公式都是病態 的[ 5] ,若h 夠小,導數不為零的情形下,在相消後會得到數值微分為零的結果[ 6] ,若h 太大,計算割線斜率的結果就會更加準確,但用割線斜率估算切線斜率的誤差就更大了。
一種可以產生夠小的h ,但又不會產生捨入誤差的方式是
ε
x
{\displaystyle {\sqrt {\varepsilon }}x}
(不過x 不能為0),其中最小浮点数 ε 大約是2.2×10−16 數量級。
[ 7] 。以下是一個一個可以平衡捨入誤差和公式誤差,有最佳精確度的h 為
h
=
2
ε
|
f
(
x
)
f
″
(
x
)
|
{\displaystyle h=2{\sqrt {\varepsilon |{f(x) \over f''(x)}|}}}
[ 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 的值,再用這個值作為微分算式的分母,不過若是用電腦計算,編譯器最佳化 的機能可能會認為dx 和h 相同,因此讓上述的方式失效。若是用C或其他類似的程式語言,可以讓xph 宣告成Volatile变量 ,以避免此一問題。
高階方法
也有用更高階估計導數的方法,或是估計高階導數的方法。
以下就是一階導數的五點法(一維下的五點模版 )[ 9]
f
′
(
x
)
=
−
f
(
x
+
2
h
)
+
8
f
(
x
+
h
)
−
8
f
(
x
−
h
)
+
f
(
x
−
2
h
)
12
h
+
h
4
30
f
(
5
)
(
c
)
{\displaystyle f'(x)={\frac {-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}{12h}}+{\frac {h^{4}}{30}}f^{(5)}(c)}
其中
c
∈
[
x
−
2
h
,
x
+
2
h
]
{\displaystyle c\in [x-2h,x+2h]}
.
微分求积
微分求积 (Differential quadrature)是用函數在特定位置數值的加權和來近似導數[ 10] [ 11] ,其名稱類似數值積分 中用的求积(quadrature),也就是像梯形法 或是辛普森法 中用的加權和,有許多方式可找出加權的係數,在求解偏微分方程 時會用到微分求积。
複變的方法
傳統用有限差分近似數值微分的方式是病態的,不過若
f
{\displaystyle f}
是全純函數 ,在實軸上的值都是實數,可以用複數平面中靠近
x
{\displaystyle x}
的位置來求值,此方式為數值穩定 的方式,例如[ 6] 一階導數可以用以下的複數導數公式計算[ 12] :
f
′
(
x
)
≈
ℑ
(
f
(
x
+
i
h
)
)
/
h
{\displaystyle f'(x)\approx \Im (f(x+ih))/h}
.
上述公式只在計一階導數時有效,若要拓展到任意階導數,需要用到多重复数 ,結果也會是多重复数的導數。[ 13]
而任意階的導數可以用柯西積分公式 計算:
f
(
n
)
(
a
)
=
n
!
2
π
i
∮
γ
f
(
z
)
(
z
−
a
)
n
+
1
d
z
{\displaystyle f^{(n)}(a)={n! \over 2\pi i}\oint _{\gamma }{f(z) \over (z-a)^{n+1}}\,\mathrm {d} z}
,
其中積分會用數值積分 計算。
Lyness和Moler在1967年提出用複變數來計算數值微分[ 14] 。Abate和Dubner提出一種用複數拉普拉斯轉換 的數值反演為基礎的算法[ 15] 。
參考資料
^ Richard L. Burden, J. Douglas Faires (2000), Numerical Analysis , (7th Ed), Brooks/Cole. ISBN 0-534-38216-9
^ Katherine Klippert Merseth. Windows on Teaching Math: Cases of Middle and Secondary Classrooms . Teachers College Press. 2003: 34 . ISBN 978-0-8077-4279-2 .
^ 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 .
^ 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).
^ Numerical Differentiation of Analytic Functions, B Fornberg - ACM Transactions on Mathematical Software (TOMS), 1981
^ 6.0 6.1 Using Complex Variables to Estimate Derivatives of Real Functions, W Squire, G Trapp - SIAM REVIEW, 1998
^ Following Numerical Recipes in C , Chapter 5.7 (页面存档备份 ,存于互联网档案馆 )
^ p. 263 [1] (页面存档备份 ,存于互联网档案馆 )
^ Abramowitz & Stegun, Table 25.2
^ Differential Quadrature and Its Application in Engineering: Engineering Applications, Chang Shu, Springer, 2000, ISBN 978-1-85233-209-9
^ Advanced Differential Quadrature Methods, Yingyan Zhang, CRC Press, 2009, ISBN 978-1-4200-8248-7
^ 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 .
^ 存档副本 (PDF) . [2012-11-24 ] . (原始内容 (PDF) 存档于2014-01-09).
^ Lyness, J. N.; Moler, C. B. Numerical differentiation of analytic functions. SIAM J.Numer. Anal. 1967, 4 : 202–210. doi:10.1137/0704019 .
^ 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 .
相關條目
外部連結