C#、コード Haishibei (42) - 悪条件一次方程式の「単純な反復解」の C# ソース コード

 

システムを使用する;

namespace Zhou.CSharp.Algorithm
{     /// <summary>     /// 線形方程式を解くためのクラス LEquations     /// オリジナルの Zhou Changfa     /// 深い混乱に適応     /// </summary>     public static Partial class LEquations     {






        /// <summary>
        /// 悪条件一次方程式の単純な反復解法
        /// </summary>
        /// <param name="mtxLECoef">指定された係数行列</param>
        /// <param name= "mtxLEConst">指定された定数行列</param>
        /// <param name="mtxResult">行列オブジェクト、方程式系の解行列を返します</param>
        /// <param name="nMaxIt">重ね合わせ回数</ param>
        /// <param name="eps">制御精度</param>
        /// <return>bool型、方程式系が正常に解けたかどうか</return>
        public static bool GetRootsetMorbid(Matrix mtxLECoef, Matrix mtxLEConst,行列 mtxResult , int nMaxIt = 60, double eps = 1.0E-7)
        {             // 方程式の次数             int n = mtxLECoef.GetNumColumns();

            // 反復回数を設定します。デフォルトは 60
            int i = nMaxIt;

            // 選択したすべてのピボットのガウス消去法で解く
            // LEquations leqs = new LEquations(mtxLECoef, mtxLEConst);
            if (!LEquations.GetRootsetGauss(mtxLECoef, mtxLEConst, mtxResult))
            {                 return false;             }             double[] x = mtxResult .GetData ();


            double q = 1.0 + eps;
            while (q >= eps)
            {                 // 反復回数は最大値に達しましたが、結果はまだ得られず、解は失敗します                 if (i == 0)                 {                     return false;                 }




                // 反復回数から 1 を引いた値
                i = i - 1;

                // 行列演算
                Matrix mtxE = mtxLECoef.Multiply(mtxResult);
                Matrix mtxR = mtxLEConst.Subtract(mtxE);

                // 選択したすべてのピボットのガウス消去法で解きます
                // leqs = new LEquations(mtxLECoef, mtxR);
                Matrix mtxRR = new Matrix();
                if (!LEquations.GetRootsetGauss(mtxLECoef, mtxR, mtxRR))
                {                     return false;                 }                 double[ ] r = mtxRR.GetData();


                ダブルqq = 0.0;
                for (int k = 0; k <= n - 1; k++)
                {                     qq = Math.Abs​​(r[k]) / (1.0 + Math.Abs​​(x[k] + r[k]));                     if (qq > q)                     {                         q = qq;                     }                 }





                for (int k = 0; k <= n - 1; k++)
                {                     x[k] = x[k] + r[k];                 }             }


            // 正常に解決された場合は
            true を返します;
        } }
    }

 

おすすめ

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