C#、海で貝殻を拾うコード (40) - 「線形最小二乗問題」を解くための「世帯主変換法」の 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="mtxQ ">行列オブジェクト、ハウスホルデ変換の Q 行列を返します</param>
        /// <param name="mtxR">Matrix オブジェクト、ハウスホルデ変換の R 行列を返します</param>
        /// <return>bool 型、方程式系が正常に解かれました</return>
        public static bool GetRootsetMqr(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult, Matrix mtxQ,Matrix mtxR)
        {             // 方程式系における方程式と未知数の数             int m = mtxLECoef.GetNumRows();             int n = mtxLECoef.GetNumColumns();



            // 特異方程式
            if (m < n)
            {                 return false;             }

            // 解ベクトルを定数ベクトルとして初期化します
            mtxResult.SetValue(mtxLEConst);
            double[] pDataConst = mtxResult.GetData();

            // QR 分解用の一時行列を構築
            mtxR.SetValue(mtxLECoef);
            double[] pDataCoef = mtxR.GetData();

            // QR 分解
            if (!Matrix.SplitQR(mtxR, mtxQ))
            {                 return false;             }

            // 一時バッファ
            double[] c = new double[n];
            double[] q = mtxQ.GetData();

            // 求解
            for (int i = 0; i <= n - 1; i++)
            {                 double d = 0.0;                 for (int j = 0; j <= m - 1; j++)                 {                     d = d + q[j * m + i] * pDataConst[j];                 c                 [i] = d;             }






            pDataConst[n - 1] = c[n - 1] / pDataCoef[n * n - 1];
            for (int i = n - 2; i >= 0; i--)
            {                 double d = 0.0;                 for (int j = i + 1; j <= n - 1; j++)                 {                     d = d + pDataCoef[i * n + j] * pDataConst[j];                 pDataConst[i] = (c[i ]                 - d) / pDataCoef[i * n + i];             }






            true を返します。
        }
}

}

おすすめ

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