ホイン法; Heun Method
概要
ホイン法とは微分方程式の数値解法の一つ。オイラー法に比べ誤差は少ないがルンゲクッタ法と比べ誤差が大きい。
積分発火ニューロンモデルなどホイン法とルンゲクッタ法の精度では、どちらも差異が無視できるほど小さいとき計算速度が有利なホイン法が用いられる時がある。
微分方程式と初期状態が以下に与えられるとき、 $$ \frac{d v}{d t} = f(t, v), \quad v(t_0) = v_0 $$
ホイン法では\(t\)の刻み幅を\(h=t_{n+1}-t_n\)としたとき、\(v_n\)の次状態\(v_{n+1}\)を以下として算出する。 $$ \begin{eqnarray} \Delta v_1 &=& h f(t_n, v_n) \\ \Delta v_2 &=& h f(t_n + h, v_n + \Delta v_1) \\ v_{n+1} &=& v_n + \frac{\Delta v_1 + \Delta v_2}{2} \end{eqnarray} $$
ソースコード
namespace ODEs {
/// <summary>ホイン法</summary>
public class HeunMethod : ODEsMethod{
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public HeunMethod(double v0, Func<double, double, double> diff_func, double diff_t) : base(v0, diff_func, diff_t) { }
/// <summary>次状態に更新</summary>
public override void Reflash() {
double dv1 = DiffT * diff_func(T, V);
double dv2 = DiffT * diff_func(T + DiffT, V + dv1);
V += (dv1 + dv2) / 2;
T += DiffT;
}
}
/// <summary>ホイン法 連立方程式</summary>
public class SHeunMethod : SODEsMethod{
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public SHeunMethod(Vector v0, Func<double, Vector, Vector> diff_func, double diff_t) : base(v0, diff_func, diff_t) { }
/// <summary>次状態に更新</summary>
public override void Reflash() {
Vector dv1 = DiffT * diff_func(T, V);
Vector dv2 = DiffT * diff_func(T + DiffT, V + dv1);
V += (dv1 + dv2) / 2;
T += DiffT;
}
}
}
関連項目
微分方程式数値解法 基本クラス
微分方程式数値解法の比較