
数値解析では、数値微分 アルゴリズムは、関数の値や関数に関するその他の知識を使用して、 数学関数または関数サブルーチンの導関数を推定します。
有限差分
最も簡単な方法は、有限差分近似を使用することです。
簡単な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の選択です。小さすぎる値を選択すると、減算によって大きな丸め誤差が生じます。実際、すべての有限差分式は条件が悪く[4] 、 hが十分に小さい場合は相殺により 0 の値が生成されます[5]。大きすぎると、割線の傾きの計算はより正確に行われますが、割線を使用した接線の傾きの推定は悪くなる可能性があります[6] 。
基本的な中心差分の場合、最適なステップはマシンイプシロンの3乗根です。[7] xとx + h で評価された数値微分式の場合、大きな丸め誤差を生じない小さなhの選択は( x = 0のときはそうではないが )、マシンイプシロンεは通常、 倍精度の場合は2.2 × 10 −16です。[8]丸め誤差と正割誤差のバランスをとって最適な精度を得るhの式は[9] です (ただし の場合はそうではありません)。この式を使用するには関数の知識が必要です。
コンピュータ計算の場合、x は必然的に何らかの精度 (32 ビットまたは 64 ビットなど)で表現可能な浮動小数点数を保持しますが、 x + h はその精度で正確に表現できないことがほとんどであるため、問題はさらに悪化します。つまり、x + h は(四捨五入または切り捨てによって) 近くのマシンで表現可能な数に変更され、その結果、( x + h ) − x はhと等しくなくなり、2 つの関数評価は正確にh離れることはありません。この点で、ほとんどの小数は 2 進数では繰り返しシーケンスであるため (1/3 が 10 進数でそうであるように)、一見丸いステップ ( h = 0.1など) は2 進数では丸い数ではなく、0.000110011001100... になります。2考えられるアプローチは次のとおりです。
h := sqrt(eps) * x; xph := x + h; dx := xph - x; 傾き:= (F(xph) - F(x)) / dx;
しかし、コンピュータの場合、コンパイラの最適化機能は実際のコンピュータ演算の詳細に注意を払わず、代わりに数学の公理を適用して dx と h が同じであると推論することがあります。Cや同様の言語では、 xphが揮発性変数であるという指示によってこれを防ぐことができます。
その他の方法
高階メソッド
導関数を近似するための高次の方法と、より高次の導関数のための方法が存在します。
以下に一次導関数の5点法(1次元の5点ステンシル)を示す: [10] ここで。
その他のステンシル構成および微分次数については、有限差分係数計算機は、任意の微分次数を持つ任意のステンシルの微分近似法を生成するために使用できるツールです (解が存在する場合)。
高次の派生語
ニュートンの差分商を用いると、 次の式が示される[11](n >0の場合):
複素変数法
数値微分に対する古典的な差分近似は条件が悪い。しかし、が実数値の正則関数で、実数直線上で、複素平面上の点 付近で評価できる場合、安定した方法がある。例えば、[5] の1 次導関数は、複素ステップ導関数の公式で計算できる。[12] [13] [14]
さまざまな条件で正確な導関数を得るために推奨されるステップサイズはである。[6]この式はテイラー級数展開 によって得られる。
複素ステップ微分公式は、1次微分を計算する場合にのみ有効です。任意の次数の微分を計算するために上記を一般化すると、多重複素数が使用され、多重複素微分が得られます。[15] [16] [17] ここで は多重複素虚数単位を表します。演算子は、レベル の多重複素数の 番目の成分を抽出します。たとえば、実数成分を抽出し、最後の「最も虚数な」成分を抽出します。この方法は、混合微分、たとえば 2次微分に適用できます。
多重複素数演算のC++実装が利用可能である。[18]
一般に、任意の次数の導関数はコーシーの積分公式[ 19] を使って計算することができる。 ここで積分は数値的に行われる。
複素変数を数値微分に使用することは、1967年にLynessとMolerによって開始されました。[20]彼らのアルゴリズムは高次微分にも適用できます。
複素ラプラス変換の数値逆変換に基づく手法は、アベートとダブナーによって開発された。[21]手法や関数の特性に関する知識を必要とせずに使用できるアルゴリズムは、フォルンバーグによって開発された。[4]
微分積分
微分積分法は、関数値の加重和を使用して導関数を近似するものである。[22] [23]微分積分法は、ノイズの多いデータから導関数を計算できるため、実用上興味深い。その名前は、シンプソン法や台形法などの方法で加重和が使用される数値積分を意味する積分法に類似している。重み係数を決定するためのさまざまな方法があり、たとえば、サビツキー・ゴレイフィルタがある。微分積分法は、偏微分方程式を解くために使用される。ノイズの多いデータから導関数を計算する方法は他にもある。[24]
参照
- 自動微分 – 導関数を伴う数値計算
- 5点ステンシル – 1点とその4つの最も近い点
- Savitzky-Golay フィルタ – データ ポイントを平滑化するアルゴリズム
- 数値積分 – 定積分の計算方法
- 数値常微分方程式 – 常微分方程式の数値解を求めるために使用される方法
- 数値平滑化と微分化 – データポイントを平滑化するアルゴリズム
- 数値解析ソフトウェア一覧
参考文献
- ^ Richard L. Burden、J. Douglas Faires (2000)、「数値解析」(第7版)、Brooks/ Cole。ISBN 0-534-38216-9。
- ^ キャサリン・クリッパート・マーセス(2003年)。『数学教育の窓:中等教育および高校の教室の事例』ティーチャーズ・カレッジ・プレス、34ページ。ISBN 978-0-8077-4279-2。
- ^ Tamara Lefcourt Ruby、James Sellers、Lisa Korf、Jeremy Van Horn、Mike Munn (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 年。
- ^ ab 複素変数を使用した実関数の導関数の推定、W. Squire、G. Trapp – SIAM REVIEW、1998年。
- ^ ab Martins, Joaquim RRA; Ning, Andrew (2021-10-01). エンジニアリング設計最適化(PDF) . ケンブリッジ大学出版局. ISBN 978-1108833417。
- ^ ザウアー、ティモシー(2012)。数値解析。ピアソン。p.248。
- ^ C言語による数値計算のレシピ、第5.7章。
- ^ 263ページ。
- ^ Abramowitz & Stegun、表25.2。
- ^ シロフ、ジョージ。初等実数解析と複素解析。
- ^ 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氏による投稿
- ^ 「アーカイブコピー」(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. Softw . 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ニュース。
