コード例 #1
0
ファイル: surface.cs プロジェクト: ufcpp/UfcppSample
    /// <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;
        }
      }
    }
コード例 #2
0
ファイル: surface.cs プロジェクト: tppApe/UfcppSample
        /// <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;
                }
            }
        }
コード例 #3
0
        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));
        }