システムを使用する;
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 を返します。
}
}
}