はじめMath! Javaでコンピュータ数学

第71回 微分・積分の数学 差分法 [後編]

この記事を読むのに必要な時間:およそ 2 分

次に,以下は(2)についての出力です。

出力画面

△ i(21) : h(4.76837158203125E-7) : diff = 0.01782371592707932 : diffc = 0.017823724076151848
△ i(22) : h(2.384185791015625E-7) : diff = 0.017823719885200262 : diffc = 0.017823724076151848
△ i(23) : h(1.1920928955078125E-7) : diff = 0.0178237222135067 : diffc = 0.017823724541813135
   i(24) : h(5.9604644775390625E-8) : diff = 0.0178237222135067 : diffc = 0.017823723144829273
★ i(25) : h(2.9802322387695312E-8) : diff = 0.017823725938796997 : diffc = 0.017823725938796997
★ i(26) : h(1.4901161193847656E-8) : diff = 0.017823725938796997 : diffc = 0.0178237222135067
★ i(27) : h(7.450580596923828E-9) : diff = 0.017823725938796997 : diffc = 0.017823725938796997
★ i(28) : h(3.725290298461914E-9) : diff = 0.017823725938796997 : diffc = 0.017823725938796997
 

★の部分で前進部分による数値微分値が,最も真の値に近づきます。△の部分で中心差分による数値微分値が,最も真の値に近づきます。何と,差分の考え方に基づいて設定した微少な量の大きさと,中心差分で実際に良好な値をはじき出す微少な量の大きさでは,まるっきり違いますね。

これは,数値微分の対象となる関数の姿に大きく影響された結果です。⁠2)の関数は次のの赤い線のようなグラフです。

図71.1 今回の問題の関数のグラフ

図71.1 今回の問題の関数のグラフ

グラフ中で(2)の関数は x =2の周辺で, y の値がほぼ一定値です。このため,差を取る計算で桁落ちを起こしたのでしょう。これに対して(1)の関数は x の値が2の周辺で, y の値が大きく変化しています。このため差分商の値が精度良く出ています。⁠2)の関数は, x =2 の周辺で変化が少ないうえに,微少な量hも精度ぎりぎりに絞っていますから,総合的に誤差が増大してしまうと考えられます。

実際の計算では,このように,試験をしてみて顕在化する不具合があるものです。今回の場合は容易に想像できるモノでしたが,計算の結果を手放しで信頼してはならないという良い例でした。より厳密な計算のためには,あらかじめ関数の変動の様子をつかんでおき,場合に応じて計算方法を調整する必要があるのです。

今回はここまで

微少な量hについて,理論的に「このぐらい」という見立てをすることが出来たと思っていましたが,実際に個別の関数について計算を実行してみると,思った通りの精度で計算できていませんでした。関数には様々な姿形があるからであり,またコンピュータ独特の問題点があるからでした。実際に,手と頭を動かし,コンピュータも動かして,双方の結果をつきあわせてみることの大切さがよく分かる課題でしたね。

今回のまとめ

  • 前進差分,中心差分の計算を実際に行うプログラムを作成しました。

著者プロフィール

平田敦(ひらたあつし)

地方都市の公立工業高等学校教諭。趣味はプログラミングと日本の端っこ踏破旅行。2010年のLotYはRuby。結城浩氏のような仕事をしたいと妄想する30代後半♂。