システムを使用する;
名前空間 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>
/// 非線形方程式の実根を求めるための Etkin 反復法
/// 方程式の左辺の関数 f(x) を計算します double Func(double x)
/// </summary >
/// < param name="Func">方程式の左端関数を計算します</param>
/// <param name="x">反復の初期値を入力し (解を推測し)、区間内に取得された実根</param>
/ // <param name="nMaxIt">再帰回数</param>
/// <param name="eps">精度制御パラメータ</param>
/// < return>Bool 型、解決が成功したかどうか</return>
public static bool GetRootAitken(delFunction_x Func, ref double x, int nMaxIt, double eps)
{ int flag, r; double u, v, x0;
// 解決条件
r = 0;
x0 = x;
flag = 0;
// 迭代求解
while ((flag == 0) && (r != nMaxIt))
{ r = r + 1; u = 関数(x0); v = 関数(u); if (Math.Abs(u - v) < eps) { x0 = v; フラグ = 1; } else { x0 = v - (v - u) * (v - u) / (v - 2.0 * u + x0); } }
x = x0;
// 指定された反復回数内で解の精度に達するかどうか
return (nMaxIt > r);
}
}
}