/// <summary> /// 微分方程式 /// (d/dt)q = f(q) /// の解を数値計算で求める。 /// </summary> /// <param name="t0">時刻の初期値</param> /// <param name="t1">時刻の最終値</param> /// <param name="dt">時刻の刻み幅</param> /// <param name="display_interval">結果出力の間隔</param> /// <param name="initial">q の初期値</param> /// <param name="f">f</param> /// <param name="cb">結果出力用のコールバック関数</param> /// <remarks> /// 4次のルンゲクッタ法で計算。 /// </remarks> 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; } } }
/// <summary> /// 微分方程式 /// (d/dt)q = f(q) /// の解を数値計算で求める。 /// </summary> /// <param name="t0">時刻の初期値</param> /// <param name="t1">時刻の最終値</param> /// <param name="dt">時刻の刻み幅</param> /// <param name="display_interval">結果出力の間隔</param> /// <param name="initial">q の初期値</param> /// <param name="f">f</param> /// <param name="cb">結果出力用のコールバック関数</param> /// <remarks> /// 4次のルンゲクッタ法で計算。 /// </remarks> 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; } } }
private static IImage phase(IImage imageA, IImage imageB) { Type channelType = imageA.ColorInfo.ChannelType; PhaseFunc phaseFunc = null; if (phaseFuncs.TryGetValue(channelType, out phaseFunc) == false) { throw new NotSupportedException(string.Format("Can not calculate phase from a image of type {0}", channelType)); } var proc = new ParallelProcessor <bool, IImage>(imageA.Size, () => { return(Image.Create(imageA.ColorInfo, imageA.Width, imageA.Height)); }, (bool _, IImage dest, Rectangle area) => { phaseFunc(imageA.GetSubRect(area), imageB.GetSubRect(area), dest.GetSubRect(area)); } /*, new ParallelOptions { ForceSequential = true }*/); return(proc.Process(true)); }