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