C#,码海拾贝(42)——病态线性方程组的“简单迭代解法”之C#源代码

 

using System;

namespace Zhou.CSharp.Algorithm
{
    ///


    /// 求解线性方程组的类 LEquations
    /// 原作 周长发
    /// 改编 深度混淆
    ///

    public static partial class LEquations
    {

        ///


        /// 病态线性方程组的简单迭代解法
        ///

        /// 指定的系数矩阵
        /// 指定的常数矩阵
        /// Matrix对象,返回方程组解矩阵
        /// 叠加次数
        /// 控制精度
        /// bool 型,方程组求解是否成功
        public static bool GetRootsetMorbid(Matrix mtxLECoef, Matrix mtxLEConst, Matrix 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();

                double 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];
                }
            }

            // 求解成功
            return true;
        }
    }
}
 

你可能感兴趣的:(C#数值计算,Numerical,Recipes,c#,开发语言)