システムを使用する;
名前空間 Zhou.CSharp.Algorithm
{ パブリック デリゲート double delFunction_x(double x); パブリックデリゲートdouble delFunction_xa(double[] x); パブリックデリゲートdouble delFunction_x_y(double x, double y); パブリックデリゲートdouble delFunction_x_ya(double x, double[] y); パブリックデリゲートdouble delFunction_xa_ya(double[] x, double[] y);
/// <summary>
/// 非線形方程式を解くためのクラス NLEquations
/// Zhou Changfa
/// 深い混乱に適応
/// </summary>
public static Partial class NLEquations
{
/// <summary>
/// 実係数を持つ代数方程式の根をすべて求める QR メソッド
/// </summary>
/// <param name="n">多項式の次数
/// <param name= "dblCoef" >n 次の多項方程式の n+1 個の係数を降順で格納する、長さ n+1 の 1 次元配列</param> /// < param name="xr">次数を含む 1 次元
配列長さ n、n ルートの実数部を返します</param>
/// <param name="xi">長さ n の 1 次元配列、n ルートの虚数部を返します</param>
/// < param name="nMaxIt ">反復回数</param>
/// <param name="eps">精度制御パラメータ</param>
/// <return>ブール型、解が成功したかどうか</return>
public static bool GetRootQr(int n, double[] dblCoef, double[] xr, double[] xi, int nMaxIt,double eps)
{ // 行列を初期化します Matrix mtxQ = new Matrix(); mtxQ.Init(n, n);
double[] q = mtxQ.GetData();
//ハーシェンベルグ行列を構築
for (int j = 0; j <= n - 1; j++)
{ q[j] = -dblCoef[n - j - 1] / dblCoef[n]; } for (int j = n ; j <= n * n - 1; j++) { q[j] = 0.0; } for (int i = 0; i <= n - 2; i++) { q[(i + 1) * n + i] = 1.0; } // 方程式の解であるハーシェンベルグ行列の固有値と固有ベクトルを求めます if (Matrix.ComputeEvHBerg(mtxQ, out xr, out xi, nMaxIt, eps)) { return true; } return false; }
}
}