システムを使用する;
名前空間 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
{
/// <
要約> /// 非線形方程式の実数根を求める準ニュートン法
/// 方程式の左端の関数 f(x) の値とその偏微分値を計算する
// / double Func(double[] x, double[] y)
/// </summary>
/// <param name="Func">方程式の左端関数を計算します</param>
/// <param name ="n">方程式の数も不明 数値</param>
/// <param name="x">初期値x0、x1、x1の集合を格納する長さnの1次元配列…、xn-1 は、返されるときに方程式系の実数根のセットを保存します
</param> /// <param name="t">h のサイズを制御する変数、0<t<1</param>
/// <param name ="h">増分初期値</param>
/// <param name="nMaxIt">反復回数</param>
/// <param name="eps">制御精度< /param>
/// <return>bool 型、解決が成功したかどうか</return>
public static bool GetRootsetNewton(delFunction_xa_ya Func, int n, double[] x, double t, double h, int nMaxIt, double eps) {
int i, j, r; ダブルアム、z、ベータ、d;
double[] y = 新しい double[n];
// 构造行列阵
Matrix mtxCoef = new Matrix(n, n);
行列 mtxConst = 新しい行列(n, 1);
double[] a = mtxCoef.GetData();
double[] b = mtxConst.GetData();
// 反復解
r = nMaxIt;
am = 1.0 + eps;
while (am >= eps)
{ Func(x, b);
午前 = 0.0;
for (i = 0; i <= n - 1; i++)
{ z = Math.Abs(b[i]); if (z > am) { am = z; } }
if (am >= eps)
{ r = r - 1; if (r == 0) { 戻り値 false; }
for (j = 0; j <= n - 1; j++)
{ z = x[j]; x[j] = x[j] + h;
Func(x, y);
for (i = 0; i <= n - 1; i++)
{ a[i * n + j] = y[i]; x [j] = z; }
// 選択されたすべてのピボットのガウス消去法を呼び出します
Matrix mtxResult = new Matrix();
if (!LEquations.GetRootsetGauss(mtxCoef, mtxConst, mtxResult))
{ return false; }
mtxConst.SetValue(mtxResult);
b = mtxConst.GetData();
ベータ = 1.0;
for (i = 0; i <= n - 1; i++)
{ beta = beta - b[i]; if (Math.Abs(beta) < float.Epsilon) { return false; }
d = h / ベータ;
for (i = 0; i <= n - 1; i++)
{ x[i] = x[i] - d * b[i]; h = t * h; } }
// 有効反復回数内で精度に達するかどうか
return (nMaxIt > r);
}
}
}