Use of numerical analysis to estimate derivatives of functions
導関数の差分推定数値解析において、数値微分 アルゴリズムは、数学関数またはサブルーチンの値を用いて、その関数の導関数を推定します。導関数の正確な表現を与える解析的微分とは異なり、数値微分は離散点の集合における関数の値を用いて、それらの点または中間点における導関数の値を推定します。このアプローチは、実験、シミュレーション、あるいは関数が特定の区間でのみ定義されている状況から得られたデータを扱う場合に特に有用です。
有限差分
最も簡単な方法は、有限差分近似を使用することです。
単純な2点推定は、点( x , f ( x ))と点( x + h , f ( x + h ))を通る近傍の割線の傾きを計算することです。[1]小さな値hを選択すると、h はxの小さな変化を表し、正または負の値をとります。この直線の傾きは、この式がニュートンの差分商(一次差分商とも呼ばれます)です。
この近似値の誤差推定値を得るには、基点付近の のテイラー展開を用いて、との間のについて を求めること
ができる。整理すると が得られる。この割線の傾きは、接線の傾きとhにほぼ比例する量だけ異なる。hがゼロに近づくにつれて、割線の傾きは接線の傾きに近づき、誤差項は消滅する。したがって、xにおけるfの真の導関数は、割線が接線に近づくにつれて、差分商の値の極限となる。







hに 0 を代入すると不定形式になるため、導関数を直接計算するのは直感的ではありません。
同様に、位置x − hとxを用いて傾きを推定することもできます。
もう1つの2点公式は、点( x − h , f ( x − h ))と点( x + h , f ( x + h ))を通る近傍の割線の傾きを計算するものである。この直線の傾きは
この式は対称差商として知られています。この場合、一次誤差は打ち消されるため、これらの割線の傾きは接線の傾きとほぼ に比例する量だけ異なります。したがって、 hの値が小さい場合、これは片側推定よりも接線のより正確な近似値となります。ただし、傾きはxで計算されますが、関数のxにおける値は考慮されません。
推定誤差は で与えられ、はとの間の点です。この誤差には、限られた精度で数値が表現され、計算が行われることによる丸め誤差は含まれません。



対称差分商は、 TI-82、TI-83、TI-84、TI-85など多くの計算機で導関数を近似する方法として採用されており、これらはすべてh = 0.001でこの方法を使用しています。[2] [3]
ステップサイズ
丸め誤差と数式誤差の両方によるhの選択の難しさを示す例関数を有限精度の浮動小数点演算を用いて計算する場合、実際にはステップサイズhの選択が重要な考慮事項となります。例として、誤差項を含む2点近似式を考えてみましょう。

ここで、は との間の点である。は関数を評価する際に生じる丸め誤差を表し、は の計算値を表すものとする。したがって、近似値における合計誤差は となる
。丸め誤差が で制限され、 の三次導関数が で制限されると仮定すると、次式が得られる。












切り捨て誤差を減らすには、 hを小さくする必要があります。しかし、h が小さくなるにつれて、丸め誤差は大きくなります。小さな値hで割る必要があるため、数値微分のためのすべての差分公式は同様に悪条件となります。[4]

この難しさを示すために、点 における関数の導関数を近似することを考えてみましょう。この場合、 を計算して が得られます。64ビット浮動小数点数を用いて、2点近似式と徐々に小さくなるステップサイズを用いて、以下の近似値が生成されます。ステップサイズ で絶対誤差が最小になり、その後は丸め誤差が計算を支配するにつれて絶対誤差は着実に増加します。




| ステップサイズ(h) | 近似 | 絶対誤差 |
|---|
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
 |  |  |
基本的な中心差分の場合、最適なステップはマシンイプシロンの立方根である。[5] xとx + hで評価された数値微分式の場合、大きな丸め誤差を生じない小さなhの選択は(x = 0のときはそうではないが)、マシンイプシロンεは通常、次のオーダーである。
倍精度の場合は2.2 × 10 −16です。[6]丸め誤差と正割誤差のバランスをとって最適な精度を得るhの式は[7]です
(ただし、のときはそうではありません)。この式を使用するには関数の知識が必要です。

コンピュータ計算では、x が必然的に何らかの精度(32 ビットまたは 64 ビットなど)で表現可能な浮動小数点数を保持しますが、 x + h がほぼ確実にその精度で正確に表現できないため、問題はさらに悪化します。 つまり、x + h は(四捨五入または切り捨てによって)近いマシン表現可能な数に変更され、その結果、( x + h ) − x はhと等しくなくなり、2 つの関数の評価が正確にh離れることはありません。 この点に関して、ほとんどの小数は 2 進法では繰り返しシーケンスであるため(10 進法での 1/3 と同様に)、一見丸いステップ、たとえばh = 0.1は2進法では丸い数ではなく、 0.000110011001100... になります。考えられるアプローチは次のとおりです。
h := sqrt(eps) * x;xph := x + h;dx := xph - x;傾き := (F(xph) - F(x)) / dx;
しかし、コンピュータの場合、コンパイラの最適化機能は実際のコンピュータ演算の詳細を考慮せず、数学の公理を適用してdxとhが同じであると推論することがあります。C言語などの類似言語では、xphがvolatile変数であるという指示文によって、このような事態を防ぐことができます。
3点法
ある関数 に対するより一般的な微分近似式を得るために、 をゼロに近い正の数とする。 の基点に関するテイラー展開は、



 | | 1 |
を置き換えると

 | | 2 |
恒等式(1)を4倍すると
 | | 1' |
( 2 )から( 1' )の恒等式を引くと次の項が消える。

これは次のように書ける。

用語を並べ替えると
これは微分に対する3点前進差分公式と呼ばれる。同様のアプローチを用いると、
これは3点中心差分公式と呼ばれ、
これは3点後退差分公式と呼ばれます。
同様のアプローチで、5点中点近似式は次のように導出できる。[8]
数値例
点 におけるの導関数を近似することを考えてみましょう。 なので、正確な値は



| 式 | ステップサイズ(h) | 近似 | 絶対誤差 |
|---|
| 3点前進差分の公式 |  |  |  |
 |  |  |
 |  |  |
 |  |  |
| 3点後方差分式 |  |  |  |
 |  |  |
 |  |  |
 |  |  |
| 3点中心差分式 |  |  |  |
 |  |  |
 |  |  |
 |  |  |
コード
以下は、 における様々な3点差分公式を用いての数値導関数を求めるPython実装の例です。この関数の導関数は です。

funcfunc_prime
| Pythonでの実装例 |
インポート数学 def func ( x ): 戻り値 ( 2 * x ) / ( 1 + math . sqrt ( x ))def func_prime ( x ): (2 + math.sqrt ( x ) )/ ((1 + math.sqrt ( x ) )** 2 )を返します def three_point_forward (値, h ): 戻り値 (( - 3 / 2 ) * func (値) + 2 * func (値 + h ) - ( 1 / 2 ) * func (値 + 2 * h )) / hdef three_point_central (値, h ): (( - 1 / 2 ) * func (値 - h ) + ( 1 / 2 ) * func (値 + h )) / hを返しますdef three_point_backward (値, h ): 戻り値 (( 1 / 2 ) * func (値 - 2 * h ) - 2 * func (値 - h ) + ( 3 / 2 ) * func (値)) / h値 = 4実際 = func_prime (値)print ( "実際の値 " + str (実際の値))印刷( "===================================================== ) step_size が[ 0.1,0.01,0.001,0.0001 ]の 場合: print ( "ステップサイズ " + str ( step_size )) forward = three_point_forward (値, ステップサイズ) 後方 = three_point_backward (値, ステップサイズ) 中央 = three_point_central (値, ステップサイズ) print ( "Forward {:>12} 、エラー = {:>12} " 。format ( str ( forward )、str ( abs ( forward - actual )))) print ( "後方{:>12} 、エラー = {:>12} " 。format ( str (前方)、 str ( abs (後方 - 実際)))) print ( "中央 {:>12} 、エラー = {:>12} " 。format ( str ( forward )、str ( abs ( central - actual )))) 印刷( "===================================================== ) |
| 出力 |
実際の 値 0.44444444444444444============================================ステップ サイズ 0.1フォワード 0.4443963018050967 、 エラー = 4.814263934771468e-05後方 0.4443963018050967 、 誤差 = 2.5082646145202503e-05中央 0.4443963018050967 、 エラー = 5.231976394060034e-05============================================ステップ サイズ 0.01フォワード 0.4444439449793336 、 エラー = 4.994651108258807e-07後方 0.4444439449793336 、 誤差 = 2.507721614808389e-07中央 0.4444439449793336 、 エラー = 5.036366184096863e-07============================================ステップ サイズ 0.001フォワード 0.4444444394311464 、 エラー = 5.013297998957e-09後方 0.4444444394311464 、 誤差 = 2.507574814458735e-09中央 0.4444444394311464 、 エラー = 5.017960935660426e-09============================================ステップ サイズ 0.0001フォワード 0.4444444443896245 、 誤差 = 5.4819926376126205e-11後方 0.4444444443896245 、 誤差 = 2.5116131396885066e-11中央 0.4444444443896245 、 誤差 = 5.037903427762558e-11============================================ |
高階微分
テイラー級数を用いることで、一般関数の2階微分(および高階微分)を近似する公式を導くことができる。関数と任意の数について、それを と について展開すると、以下のようになる。



そして、これら2つの式を加えると、

![{\displaystyle f(x+h)+f(xh)=2f(x)+f''(x)h^{2}+{\frac {1}{24}}\left[f^{(4)}(\xi _{1})+f^{(4)}(\xi _{2})\right]h^{4}.}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
が 上で連続ならば、 はと の間にあります。中間値定理は、例えばが との間にあることを保証します。したがって、
![{\displaystyle [xh,x+h]}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
![{\displaystyle {\frac {1}{2}}\left[f^{(4)}(\xi _{1})+f^{(4)}(\xi _{2})\right]}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)





![{\displaystyle f''(x)={\frac {1}{h^{2}}}\left[f(xh)-2f(x)+f(x+h)\right]-{\frac {h^{2}}{12}}f^{(4)}(\xi ).}](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
どこ。
数値例
点における関数の2次導関数を近似することを検討します。

なので、正確な値は です。

| ステップサイズ(h) | 近似 | 絶対誤差 |
|---|
 |  |  |
 |  |  |
 |  |  |
 |  |  |
任意の導関数
ニュートンの差分商を用いると次のことが示される[9](n > 0の場合):

複素変数法
数値微分における古典的な差分近似は条件が悪くなります。しかし、 が実数値直線上の正則関数で、複素平面上の 近傍の点で評価できる場合、安定した手法が存在します。例えば、[10] の1次導関数は、複素ステップ導関数公式によって計算できます。[11] [12] [13]


様々な条件で正確な導関数を得るために推奨されるステップサイズはである。[14]この式はテイラー級数展開
によって得られる。

複素ステップ微分公式は、1階微分を計算する場合にのみ有効です。上記の任意の階数の微分を計算するための一般化は、多重複素数を用いることで、結果として多重複素微分が得られます。[15] [16] [17]ここで は多重複素虚数単位を表します。演算子は、レベル の多重複素数の 番目の成分を抽出します。例えば、 は実数成分を抽出し、最後の「最も虚数的な」成分を抽出します。この方法は、混合微分にも適用できます。例えば、2階微分の場合です。








多重複素数演算のC++実装が利用可能である。[18]
一般に、任意の次数の導関数はコーシーの積分公式[19]を使って計算することができる。ここで積分は数値的に行われる。
数値微分に複素変数を使用することは、1967年にLynessとMolerによって開始されました。[20]彼らのアルゴリズムは高次微分にも適用できます。
複素ラプラス変換の数値逆変換に基づく手法は、アベートとダブナーによって開発された。[21]手法や関数の特性に関する知識を必要とせずに使用できるアルゴリズムは、フォルンバーグによって開発された。[4]
微分求積法
微分積分法は、関数値の重み付き和を用いた導関数の近似である。[22] [23]微分積分法は、ノイズの多いデータから導関数を計算できるため、実用上重要である。その名称は、シンプソンの法則や台形則などの方法で重み付き和が使用される数値積分法を意味する積分法に類似している。重み係数を決定するための様々な方法があり、例えば、サビツキー・ゴレイフィルタがある。微分積分法は偏微分方程式を解くために使用される。ノイズの多いデータから導関数を計算するための方法は他にもある。[24]
参照
参考文献
- ^ Richard L. Burden, J. Douglas Faires (2000), Numerical Analysis , (7th Ed), Brooks/Cole. ISBN 0-534-38216-9。
- ^ キャサリン・クリッパート・マーセス (2003). 『数学教育の窓:中等教育および高校の教室の事例』ティーチャーズ・カレッジ・プレス. p. 34. ISBN 978-0-8077-4279-2。
- ^ タマラ・レフコート・ルビー、ジェームズ・セラーズ、リサ・コルフ、ジェレミー・ヴァン・ホーン、マイク・マン (2014). Kaplan AP Calculus AB & BC 2015 . Kaplan Publishing. p. 299. ISBN 978-1-61865-686-5。
- ^ ab 解析関数の数値微分、B Fornberg – ACM Transactions on Mathematical Software (TOMS)、1981 年。
- ^ ザウアー、ティモシー (2012).数値解析. ピアソン. p.248.
- ^ C言語による数値計算のレシピ、第5.7章。
- ^ 263ページ。
- ^ Abramowitz & Stegun、表25.2。
- ^ シロフ、ジョージ。初等実解析と複素解析。
- ^ 複素変数を用いた実関数の導関数の推定、W. Squire、G. Trapp – SIAM REVIEW、1998年。
- ^ Martins, JRRA; Sturdza, P.; Alonso, JJ (2003). 「複素ステップ微分近似」. ACM Transactions on Mathematical Software . 29 (3): 245– 262. CiteSeerX 10.1.1.141.8002 . doi :10.1145/838250.838251. S2CID 7022422.
- ^ ニコラス・ハイアム著『差異のない差別化』
- ^ MathWorksブログの記事、 Cleve Moler氏による投稿
- ^ Martins, Joaquim RRA; Ning, Andrew (2021-10-01). エンジニアリング設計最適化(PDF) . ケンブリッジ大学出版局. ISBN 978-1108833417。
- ^ 「アーカイブコピー」(PDF) 。 2014年1月9日時点のオリジナル(PDF)からアーカイブ。 2012年11月24日閲覧。
{{cite web}}: CS1 maint: archived copy as title (link) - ^ Lantoine, G.; Russell, RP; Dargent, Th. (2012). 「高階導関数の自動計算における多重複素変数の利用」ACM Trans. Math. Software . 38 (3): 1– 21. doi :10.1145/2168773.2168774. S2CID 16253562.
- ^ Verheyleweghen, A. (2014). 「多重複素ステップ法を用いた高次導関数の計算」(PDF) .
- ^ Bell, IH (2019). 「mcx (多複素数代数ライブラリ)」. GitHub .
- ^ Ablowitz, MJ, Fokas, AS,(2003). 複素変数:入門と応用. Cambridge University Press . 定理2.6.2を確認
- ^ Lyness, JN; Moler, CB (1967). 「解析関数の数値微分」. SIAM J. Numer. Anal . 4 (2): 202– 210. Bibcode :1967SJNA....4..202L. doi :10.1137/0704019.
- ^ Abate, J; Dubner, H (1968年3月). 「関数のべき級数展開を生成するための新しい方法」. SIAM J. Numer. Anal . 5 (1): 102– 112. Bibcode :1968SJNA....5..102A. doi :10.1137/0705008.
- ^ 微分積分法とその工学への応用:工学応用、Chang Shu、Springer、2000年、 ISBN 978-1-85233-209-9。
- ^ 上級微分求積法、Yingyan Zhang、CRC Press、2009年、 ISBN 978-1-4200-8248-7。
- ^ Ahnert, Karsten; Abel, Markus (2007). 「実験データの数値微分:局所的手法と全体的手法」. Computer Physics Communications . 177 (10): 764– 774. Bibcode :2007CoPhC.177..764A. CiteSeerX 10.1.1.752.3843 . doi :10.1016/j.cpc.2007.03.009. ISSN 0010-4655. S2CID 15129086.
外部リンク
ウィキブックスには「数値解析法」に関する書籍があります。
- wolfram.com の数値微分
- NAGライブラリ数値微分ルーチン
- Boost。有限差分と複素ステップ微分を含む数学の数値微分
- 差異のある(ない)差別化、Nicholas Higham著、SIAM News。