無意味なブログ

勉強のこと、趣味のこと、日記など適当に

MENU

微分方程式をプログラムで解こう!(5):差分法[4]「陽的差分と陰的差分の比較」

前回(第4回)
微分方程式をプログラムで解こう!(4):差分法[3]「陰的な差分法」 - 無意味なブログ

前回は4次精度陰的差分法を使ってsin(x)を微分してみました。
今回は陽的差分法と陰的差分法の数値誤差・計算時間を比較します。

用いる計算手法・比較方法

今回は以下の計算手法を用いました。
陽的差分法:4次精度中心差分法
陰的差分法:4次精度陰的差分法

それぞれの計算手法を用いてsin(x)を微分します。
微分範囲はx=0からx=2πとします。
まずは分割数Nを10,100,1000とした時の数値誤差・計算時間を比較します。

数値誤差の比較

最大誤差は以下のようになりました。
N=10の時
陽的差分の場合:max error = 4.9565311620335395E-003
陰的差分の場合:max error = 9.0748579098476334E-004

N=100の時
陽的差分の場合:max error = 5.1927104882665276E-007
陰的差分の場合:max error = 8.6626565254377397E-008

N=1000の時
陽的差分の場合:max error = 5.2006954298633445E-011
陰的差分の場合:max error = 8.7692075823042615E-012

この結果を横軸log(分割数)、縦軸log(最大誤差)でグラフにすると以下のようになります。
f:id:kouya17:20170723074604p:plain

陽的・陰的共に全体の傾向は同じです。
今回は陽的・陰的共に4次精度のものを用いたので、傾きはほぼ同じです。
全体的に陰的差分の方が誤差がちょっとだけ小さいです。


数値誤差は陽的・陰的共に同じような結果となりました。

計算時間の比較

計算時間は以下のようになりました。
N=10の時
陽的差分の場合:time= 0.0000000000000000 [s]
陰的差分の場合:time= 0.0000000000000000 [s]

N=100の時
陽的差分の場合:time= 0.0000000000000000 [s]
陰的差分の場合:time= 2.0000000000000000E-003 [s]

N=1000の時
陽的差分の場合:time= 0.0000000000000000 [s]
陰的差分の場合:time= 2.9460000000000002 [s]

陽的差分は計算時間が短すぎて、うまく測れませんでした。
陰的差分はN=100からN=1000にかけて、計算時間が約1500倍になっています。
分割数が10倍に対して、計算時間が1500倍になっているので、陰的差分法は分割数に対して敏感な計算手法といえそうです。


陽的差分法に関しては、分割数をより大きく(N=100000,1000000,10000000)して計算時間を確認しました。
結果は以下のようになりました。
N=100000の時
陽的差分の場合:time= 1.0000000000000000E-003 [s]

N=1000000の時
陽的差分の場合:time= 8.9999999999999993E-003 [s]

N=10000000の時
陽的差分の場合:time= 9.8000000000000004E-002 [s]

陽的差分の場合、分割数が10倍になると、計算時間は約10倍になるという結果になりました。


以上の結果から、陽的差分と陰的差分について計算時間を比べると、陰的差分は陽的差分と比べ分割数に対して敏感で、分割数が増加すると計算時間が急激に増加するということがわかります。

まとめ

●陽的差分法と陰的差分法の数値誤差・計算時間を比較したところ、以下のような結果が得られました。
 ・数値誤差は陽的・陰的共に4次精度のものを用いたため、同じような結果となった。
 ・計算時間は陰的差分の方が陽的差分に比べて長い。
 ・陰的差分の方が陽的差分に比べて、分割数の増加に対して計算時間の増加量が大きい。

シリーズ第5回「差分法[4]陽的差分と陰的差分の比較」は以上です。
次回からは時間積分法について書きたいと思います。