微分方程式の数値解析 #11

CやJavaに慣れるとFORTRANでの接尾辞なしの浮動小数点型リテラルが単精度であることを忘れてしまう。
前項でのLorenz方程式の初期値問題で与えた初期値

  double precision, parameter :: x0(3) = (/1d-1, 1d-1, 1d-1/) ! initial coordinate at t0

  double precision, parameter :: x0(3) = (/0.1, 0.1, 0.1/) ! initial coordinate at t0

になっていると、Lorenz方程式の初期値の変化に対する感受性の高さゆえに、その結果は、

となり、明らかに結果が変わってくる。
単精度実数の0.1と倍精度実数の0.1の差は、

print *, 0.1 - 1d-1
end
  1.49011611383365050E-009

であり、0.1に対する両精度の差の比は1.5e-8程度でしかない。
こういう結果を見ると初期値感受性以前に数値解析そのものの質が気になってくる。
つまり小さな誤差が結果を大きく変える可能性がある。