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

Euler法よりもマシなはずの中点法で計算してみる。
Euler法との違いは漸化式のg(t_n,x_n,h)の定義部分だけである。

...snip
  double precision function nextx(t, x, h)
    double precision, intent(in) :: t, x, h
    double precision :: k1, k2
    k1 = f(t, x)
    k2 = f(t + h / 2, x + h / 2 * k1)
    nextx = x + h * k2
  end function nextx
...snip

実行結果は、

   0.00000000   0.00000000   0.00000000
   0.10000000   0.10033466   0.10033467
   0.20000000   0.20271002   0.20271004
   0.30000000   0.30933621   0.30933625
   0.40000000   0.42279316   0.42279322
   0.50000000   0.54630239   0.54630249
   0.60000000   0.68413664   0.68413681
   0.70000000   0.84228810   0.84228838
   0.80000000   1.02963807   1.02963856
   0.90000000   1.26015733   1.26015822
   1.00000000   1.55740601   1.55740772
   1.10000000   1.96475607   1.96475966
   1.20000000   2.57214305   2.57215162
   1.30000000   3.60207690   3.60210245
   1.40000000   5.79776617   5.79788372
   1.50000000  14.09953074  14.10141995

Euler法と同じ刻み幅で、t=1.5での相対誤差が1e-4強でありかなり改善されている。