システムを使用する;
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>
/// <return>bool型、方程式系 解が成功したかどうか</param> return>
public static bool GetRootsetTlvs(Matrix mtxLECoef, Matrix mtxLEConst, Matrix mtxResult)
{ int i, j, k; double a, beta, q, c, h;
// 未知数の数
int n = mtxLECoef.GetNumColumns();
// 解ベクトルを初期化します
mtxResult.Init(n, 1);
double[] x = mtxResult.GetData();
// 定数配列
double[] pDataConst = mtxLEConst.GetData();
// T 配列を作成します
double[] t = new double[n];
// 构造T数组
for (i = 0; i < n; ++i)
{
t[i] = mtxLECoef.GetElement(0, i);
}
// 一時配列
double[] s = new double[n];
double[] y = new double[n];
// 非トーベルリッツ方程式、このメソッドは a = t[0] を解くのに使用できません
;
if (Math.Abs(a) < float.Epsilon)
{ return false; }
// y[0] = 1.0;
x[0] = pDataConst[0] / a;
for (k = 1; k <= n - 1; k++)
{ beta = 0.0; q = 0.0; for を解くレビンソン法(j = 0; j <= k - 1; j++) { beta = beta + y[j] * t[j + 1]; q = q + x[j] * t[k - j]; }
if (Math.Abs(a) < float.Epsilon)
{ return false; }
c = -ベータ / a;
s[0] = c * y[k - 1];
y[k] = y[k - 1];
if (k != 1)
{ for (i = 1; i <= k - 1; i++) { s[i] = y[i - 1] + c * y[k - i - 1]; } }
a = a + c * ベータ;
if (Math.Abs(a) < float.Epsilon)
{ return false; }
h = (pDataConst[k] - q) / a;
for (i = 0; i <= k - 1; i++)
{ x[i] = x[i] + h * s[i]; y[i] = s[i]; }
x[k] = h * y[k];
}
true を返します。
}
}
}