C#、コード ハイシベイ (50) - 「非線形方程式」の実根を求める「モンテカルロ法」の C# ソースコード

システムを使用する;

 

名前空間 Zhou.CSharp.Algorithm
{     パブリック デリゲート double delFunction_x(double x);     パブリックデリゲートdouble delFunction_xa(double[] x);     パブリックデリゲートdouble delFunction_x_y(double x, double y);     パブリックデリゲートdouble delFunction_x_ya(double x, double[] y);     パブリックデリゲートdouble delFunction_xa_ya(double[] x, double[] y);




    /// <summary>
    /// 非線形方程式を解くためのクラス NLEquations
    /// Zhou Changfa
    /// 深い混乱に適応
    /// </summary>
    public static Partial class NLEquations
    {

        /// <summary>
        /// 非線形方程式の実根を求めるモンテカルロ法
        /// 方程式の左辺の関数 f(x) を計算します double Func(double x)
        /// </summary >
        /// <param name="Func">方程式の左端関数を計算します</param>
        /// <param name="x">初期値を入力(解を推測)し、得られた実根を返します</param>
        /// <param name ="xStart">一様分布の終点の初期値</param>
        /// <param name="nControlB">制御パラメータ</param>
        /// < param name="eps">制御精度</param>
        public static void GetRootMonteCarlo(delFunction_x Func, ref double x, double xStart, int nControlB, double eps)
        {             int k;             double xx, a, y, x1, y1, r ;

            // 解決条件
            a = xStart;
            k = 1;
            r = 1.0;

            // 初期値
            xx = x;
            y = Func(xx);

            // 精度制御ソリューション
            while (a >= eps)
            {                 x1 = rnd(ref r);

                x1 = -a + 2.0 * a * x1;
                x1 = xx + x1;
                y1 = 関数(x1);

                k = k + 1;
                if (Math.Abs​​(y1) >= Math.Abs​​(y))
                {                     if (k > nControlB)                     {                         k = 1;                         a = a / 2.0;                     }                 }                 else                 {                     k = 1;                     xx = x1;                     y = y1;                     if (Math.Abs​​(y) < eps)                     {                         x = xx;                         戻る;                     }             }                 }

















            x = xx;
        }

        /// <summary>
        /// 内部関数数
        /// </summary>
        private static double rnd(ref double r)
        {             double s = 65536.0;             ダブル u = 2053.0;             ダブル v = 13849.0;             int m = (int)(r / s);             r = r - m * s;             r = u * r + v;             m = (int)(r / s);             r = r - m * s;             ダブル p = r / s;             リターン (p);         }











 

}

}

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/131233958