ConsoleApplication1.PhaseVector.Simulate C# (CSharp) Method

Simulate() public static method

微分方程式 (d/dt)q = f(q) の解を数値計算で求める。
4次のルンゲクッタ法で計算。
public static Simulate ( double t0, double t1, double dt, int display_interval, PhaseVector initial, PhaseFunc f, Callback cb ) : void
t0 double 時刻の初期値
t1 double 時刻の最終値
dt double 時刻の刻み幅
display_interval int 結果出力の間隔
initial PhaseVector q の初期値
f PhaseFunc f
cb Callback 結果出力用のコールバック関数
return void
    public static void Simulate(
      double t0, double t1, double dt, int display_interval,
      PhaseVector initial,
      PhaseFunc f, Callback cb)
    {
      PhaseVector q = initial;

      int n = 1;
      for (double t = t0; t < t1; t += dt, ++n)
      {
        PhaseVector k1 = dt * f(q);
        PhaseVector k2 = dt * f(q + k1 / 2);
        PhaseVector k3 = dt * f(q + k2 / 2);
        PhaseVector k4 = dt * f(q + k3);
        q = q + (k1 + 2 * (k2 + k3) + k4) / 6;

        if (n > display_interval)
        {
          cb(t, q);
          n = 1;
        }
      }
    }
  }

Usage Example

コード例 #1
0
ファイル: surface.cs プロジェクト: tppApe/UfcppSample
        static void Main(string[] args)
        {
            const double dt               = 0.01;
            const double t_end            = 10;
            const int    DISPLAY_INTERVAL = 5;

            const double q1 = 0;
            const double q2 = Math.PI / 2;
            const double p1 = 0.1;
            const double p2 = 0;

            PhaseVector.Simulate(
                0, t_end, dt, DISPLAY_INTERVAL,
                new PhaseVector(q1, q2, p1, p2),
                F, Show
                );
        }