C#、コード Haishibei (54) - 「非線形方程式」の実数根のセットに対する「準ニュートン法」の 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
    {
 

        /// <
        要約> /// 非線形方程式の実数根を求める準ニュートン法
        /// 方程式の左端の関数 f(x) の値とその偏微分値を計算する
        // / double Func(double[] x, double[] y)
        /// </summary>
        /// <param name="Func">方程式の左端関数を計算します</param>
        /// <param name ="n">方程式の数も不明 数値</param>
        /// <param name="x">初期値x0、x1、x1の集合を格納する長さnの1次元配列…、xn-1 は、返されるときに方程式系の実数根のセットを保存します
        </param> /// <param name="t">h のサイズを制御する変数、0<t<1</param>
        /// <param name ="h">増分初期値</param>
        /// <param name="nMaxIt">反復回数</param>
        /// <param name="eps">制御精度< /param>
        /// <return>bool 型、解決が成功したかどうか</return>
        public static bool GetRootsetNewton(delFunction_xa_ya Func, int n, double[] x, double t, double h, int nMaxIt, double eps) {
        int             i, j, r;             ダブルアム、z、ベータ、d;

            double[] y = 新しい double[n];

            // 构造行列阵
            Matrix mtxCoef = new Matrix(n, n);
            行列 mtxConst = 新しい行列(n, 1);
            double[] a = mtxCoef.GetData();
            double[] b = mtxConst.GetData();

            // 反復解
            r = nMaxIt;
            am = 1.0 + eps;
            while (am >= eps)
            {                 Func(x, b);

                午前 = 0.0;
                for (i = 0; i <= n - 1; i++)
                {                     z = Math.Abs​​(b[i]);                     if (z > am)                     {                         am = z;                     }                 }





                if (am >= eps)
                {                     r = r - 1;                     if (r == 0)                     {                         戻り値 false;                     }




                    for (j = 0; j <= n - 1; j++)
                    {                         z = x[j];                         x[j] = x[j] + h;

                        Func(x, y);

                        for (i = 0; i <= n - 1; i++)
                        {                             a[i * n + j] = y[i];                         x                         [j] = z;                     }



                    // 選択されたすべてのピボットのガウス消去法を呼び出します
                    Matrix mtxResult = new Matrix();
                    if (!LEquations.GetRootsetGauss(mtxCoef, mtxConst, mtxResult))
                    {                         return false;                     }

                    mtxConst.SetValue(mtxResult);
                    b = mtxConst.GetData();

                    ベータ = 1.0;
                    for (i = 0; i <= n - 1; i++)
                    {                         beta = beta - b[i];                     if (Math.Abs​​(beta) < float.Epsilon)                     {                     return                         false;                     }





                    d = h / ベータ;
                    for (i = 0; i <= n - 1; i++)
                    {                         x[i] = x[i] - d * b[i];                     h                     = t * h;                 }             }




            // 有効反復回数内で精度に達するかどうか
            return (nMaxIt > r);
        }
 

}

}

おすすめ

転載: blog.csdn.net/beijinghorn/article/details/131276718
おすすめ