微分方程式数値解法 基本クラス
概要
各種微分方程式数値解法クラスに継承される。
ソースコード
namespace ODEs {
/// <summary>微分方程式(Ordinary Differential Equations)数値解法基本クラス</summary>
public abstract class ODEsMethod {
protected readonly Func<double, double, double> diff_func;
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public ODEsMethod(double v0, Func<double, double, double> diff_func, double diff_t) {
if(diff_t <= 0 || double.IsInfinity(diff_t) || double.IsNaN(diff_t)) {
throw new ArgumentException(nameof(diff_t));
}
if(diff_func == null) {
throw new ArgumentNullException(nameof(diff_func));
}
this.diff_func = diff_func;
this.DiffT = diff_t;
Initialize(v0);
}
/// <summary>時間</summary>
public double T { get; protected set; }
/// <summary>時間刻み幅</summary>
public double DiffT { get; }
/// <summary>状態値</summary>
public double V { get; protected set; }
/// <summary>次状態に更新</summary>
public abstract void Reflash();
/// <summary>初期化</summary>
/// <param name="v0">初期値</param>
public void Initialize(double v0) {
T = 0;
V = v0;
}
}
/// <summary>連立微分方程式(Simultaneous Ordinary Differential Equations)数値解法基本クラス</summary>
public abstract class SODEsMethod {
protected readonly Func<double, Vector, Vector> diff_func;
/// <summary>コンストラクタ</summary>
/// <param name="v0">初期値</param>
/// <param name="diff_func">微分方程式</param>
/// <param name="diff_t">時間刻み幅</param>
public SODEsMethod(Vector v0, Func<double, Vector, Vector> diff_func, double diff_t) {
if(diff_t <= 0 || double.IsInfinity(diff_t) || double.IsNaN(diff_t)) {
throw new ArgumentException(nameof(diff_t));
}
if(v0 == null) {
throw new ArgumentNullException(nameof(v0));
}
if(diff_func == null) {
throw new ArgumentNullException(nameof(diff_func));
}
this.diff_func = diff_func;
this.DiffT = diff_t;
Initialize(v0);
}
/// <summary>時間</summary>
public double T { get; protected set; }
/// <summary>時間刻み幅</summary>
public double DiffT { get; }
/// <summary>状態値</summary>
public Vector V { get; protected set; }
/// <summary>次状態に更新</summary>
public abstract void Reflash();
/// <summary>初期化</summary>
/// <param name="v0">初期値</param>
public void Initialize(Vector v0) {
T = 0;
V = (Vector)v0.Clone();
}
}
}
関連項目
ベクトルクラス