C#,码海拾贝(41)——求解“线性最小二乘问题”的“广义逆法”之C#源代码

C#,码海拾贝(41)——求解“线性最小二乘问题”的“广义逆法”之C#源代码_第1张图片

 

using System;

namespace Zhou.CSharp.Algorithm
{
    ///


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

    public static partial class LEquations
    {

        ///


        /// 求解线性最小二乘问题的广义逆法
        ///

        /// 指定的系数矩阵
        /// 指定的常数矩阵
        /// Matrix对象,返回方程组解矩阵
        /// Matrix对象,返回系数矩阵的广义逆矩阵
        /// Matrix对象,返回U矩阵
        /// Matrix对象,返回V矩阵
        /// 控制精度
        /// bool 型,方程组求解是否成功
        public static bool GetRootsetGinv(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult, Matrix mtxAP, Matrix mtxU, Matrix mtxV, double eps)
        {
            // 方程个数和未知数个数
            int m = mtxLECoef.GetNumRows();
            int n = mtxLECoef.GetNumColumns();

            // 初始化解向量
            mtxResult.Init(n, 1);

            double[] pDataConst = mtxLEConst.GetData();
            double[] x = mtxResult.GetData();

            // 临时矩阵
            Matrix mtxA = new Matrix(mtxLECoef);

            // 求广义逆矩阵
            if (!Matrix.InvertUV(mtxA, mtxAP, mtxU, mtxV, eps))
            {
                return false;
            }

            double[] pAPData = mtxAP.GetData();

            // 求解
            for (int i = 0; i <= n - 1; i++)
            {
                x[i] = 0.0;
                for (int j = 0; j <= m - 1; j++)
                {
                    x[i] = x[i] + pAPData[i * m + j] * pDataConst[j];
                }
            }
            return true;
        }
}

}

你可能感兴趣的:(C#数值计算,Numerical,Recipes,c#,数学建模,线性代数,矩阵,算法)