オイラー法; Euler 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} v_{n+1} &=& v_n + h f(t_n, v_n) \end{eqnarray} $$
ソースコード
namespace ODEs {
/// <summary>オイラー法</summary>
public class EulerMethod : ODEsMethod{
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public EulerMethod(double v0, Func<double, double, double> diff_func, double diff_t) : base(v0, diff_func, diff_t) { }
/// <summary>次状態に更新</summary>
public override void Reflash() {
V += DiffT * diff_func(T, V);
T += DiffT;
}
}
/// <summary>オイラー法 連立方程式</summary>
public class SEulerMethod : SODEsMethod{
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public SEulerMethod(Vector v0, Func<double, Vector, Vector> diff_func, double diff_t) : base(v0, diff_func, diff_t) { }
/// <summary>次状態に更新</summary>
public override void Reflash() {
V += DiffT * diff_func(T, V);
T += DiffT;
}
}
}
関連項目
微分方程式数値解法 基本クラス
微分方程式数値解法の比較