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

有限差分法
-----

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

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

{\displaystyle {f(x+h)-f(x) \over h}.}
此表示法是牛頓的差商，也稱為一階均差。

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

{\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)*)二點的割線，其斜率為

{\displaystyle {f(x+h)-f(x-h) \over 2h}.}
上述公式稱為對稱差分，其一次項誤差相消，因此割線斜率和切線斜率的差和{\displaystyle h^{2}}成正比。對於很小的*h*而言這個值比單邊近似還要準確。特別的是公式雖計算x點的斜率，但不會用到函數在x點的數值。

估計誤差為：

{\displaystyle R={{-f^{(3)}(c)} \over {6}}h^{2}},
其中{\displaystyle c}為在{\displaystyle x-h}和{\displaystyle x+h}之間的某一點。此誤差沒有包括因為有限準確度而產生的捨入誤差。

很多工程計算機都是用對稱差分來計算導數，像德州儀器（TI）的TI-82、TI-83、TI-84及TI-85，其*h*=0.001。

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

### 利用浮點數的實際考量

在浮點數運算下，不同的{\displaystyle h}造成的捨入誤差及公式誤差，只有在特定值下誤差才是最小值
若計算時使用浮點數，就需要考慮*h*要取到多小。若選的太小，相減之後會有大的捨入誤差，事實上整個有限差分的公式都是病態的，若*h*夠小，導數不為零的情形下，在相消後會得到數值微分為零的結果，若*h*太大，計算割線斜率的結果就會更加準確，但用割線斜率估算切線斜率的誤差就更大了。

一種可以產生夠小的*h*，但又不會產生捨入誤差的方式是{\displaystyle {\sqrt {\varepsilon }}x}（不過*x*不能為0），其中最小浮点数（英语：）*ε*大約是2.2×10−16數量級。
。以下是一個一個可以平衡捨入誤差和公式誤差，有最佳精確度的*h*為

{\displaystyle h=2{\sqrt {\varepsilon |{f(x) \over f''(x)}|}}}

（不過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变量，以避免此一問題。

### 高階方法

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

以下就是一階導數的五點法（一維下的五點模版（英语：））

{\displaystyle f'(x)={\frac {-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}{12h}}+{\frac {h^{4}}{30}}f^{(5)}(c)}
其中{\displaystyle c\in [x-2h,x+2h]}.

微分求积
----

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

複變的方法
-----

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

{\displaystyle f'(x)\approx \Im (f(x+ih))/h}.
上述公式只在計一階導數時有效，若要拓展到任意階導數，需要用到多重复数，結果也會是多重复数的導數。

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

{\displaystyle f^{(n)}(a)={n! \over 2\pi i}\oint \_{\gamma }{f(z) \over (z-a)^{n+1}}\,\mathrm {d} z},
其中積分會用數值積分計算。

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

參考資料
----

1. ↑  Richard L. Burden, J. Douglas Faires (2000), *Numerical Analysis*, (7th Ed), Brooks/Cole. ISBN 0-534-38216-9
2. ↑  Katherine Klippert Merseth.. 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 Publishing. 2014: 299. ISBN 978-1-61865-686-5.
4. ↑  Andreas Griewank; Andrea Walther.. 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. 1 2  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  （页面存档备份，存于）
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.. 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.. SIAM J.Numer. Anal. 1967, **4**: 202–210. doi:10.1137/0704019.
15. ↑  Abate, J; Dubner, H.. SIAM J. Numer. Anal. March 1968, **5** (1): 102–112. doi:10.1137/0705008.

相關條目
----

* 自動微分
* 差分
* 五点模板（英语：）
* 數值積分
* 數值常微分方程（英语：）
* Savitzky–Golay濾波器（英语：）
* 數值分析軟體列表（英语：）

外部連結
----

* （页面存档备份，存于）
* 
* Numerical Differentiation Resources: Textbook notes, PPT, Worksheets, Audiovisual YouTube Lectures at Numerical Methods for STEM Undergraduate
* Fortran code for the numerical differentiation of a function using Neville's process to extrapolate from a sequence of simple polynomial approximations.
* NAG Library numerical differentiation routines （页面存档备份，存于）
* （页面存档备份，存于） Online numerical graphing calculator with calculus function. （页面存档备份，存于）