C#、コード灰石兵衛 (43) - 「非線形方程式の実根」の「二分法」の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>         ///非線形方程式の実根を求める二分法         /// </summary>         /// <param name="Func">方程式の左端の関数を計算 double Func(double x)</param>         /// <param name=" nNumRoots">[xStart, xEnd] の実根の数の推定値</param>         /// <param name="x">1 次元配列、長さは m です。間隔 [xStart,









        /// <param name="eps">精度制御パラメータ</param>
        /// <return>int型、取得した実根数</return>
        public static int GetRootBisect(delFunction_x Func, int nNumRoots, double [ ] x、double xStart、double xEnd、double dblStep、double eps)
        {             int n, js;             double z、y、z1、y1、z0、y0;

            // ルートの数は 0 にクリアされます
            n = 0;

            // 左端から検索
            z = xStart;
            y = Func(z);

            // 循環求解
            while ((z <= xEnd + dblStep / 2.0) && (n != nNumRoots))
            {                 if (Math.Abs​​(y) < eps)                 {                     n = n + 1;                     x[n - 1] = z;                     z = z + dblステップ / 2.0;                     y = 関数(z);                 }                 else                 {                     z1 = z + dblStep;                     y1 = 関数(z1);










                    if (Math.Abs​​(y1) < eps)
                    {                         n = n + 1;                         x[n - 1] = z1;                         z = z1 + dblStep / 2.0;                         y = 関数(z);                     else                     if (y * y1 > 0.0)                     {                         y = y1;                         z = z1;                     }                     else                     {                         js = 0;                         while (js == 0)                         {                             if (Math.Abs​​(z1 - z) < eps)
















                            {                                 n = n + 1;                                 x[n - 1] = (z1 + z) / 2.0;                                 z = z1 + dblStep / 2.0; y = 関数(z);                                 js = 1;                             }                             else                             {                                 z0 = (z1 + z) / 2.0;                                 y0 = 関数(z0);                                 if (Math.Abs​​(y0) < eps)                                 {                                     x[n] = z0;                                     n = n + 1;













                                    js = 1;
                                    z = z0 + dblStep / 2.0;
                                    y = 関数(z);
                                else
                                if ((y * y0) < 0.0)
                                {                                     z1 = z0;                                     y1 = y0;                                 }                                 else                                 {                                     z = z0;                                     y = y0;                                 }                             }









                        }
                    }             }
                }

            // 実根の数を返す
            return (n);
        }
 

}

}

おすすめ

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