システムを使用する;
名前空間 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> ///非線形方程式の実根を求める二分法 /// </summary> /// <param name="Func">方程式の左端の関数を計算 double Func(double x)</param> /// <param name=" nNumRoots">[xStart, xEnd] の実根の数の推定値</param> /// <param name="x">1 次元配列、長さは m です。間隔 [xStart,
/// <param name="eps">精度制御パラメータ</param>
/// <return>int型、取得した実根数</return>
public static int GetRootBisect(delFunction_x Func, int nNumRoots, double [ ] x、double xStart、double xEnd、double dblStep、double eps)
{ int n, js; double z、y、z1、y1、z0、y0;
// ルートの数は 0 にクリアされます
n = 0;
// 左端から検索
z = xStart;
y = Func(z);
// 循環求解
while ((z <= xEnd + dblStep / 2.0) && (n != nNumRoots))
{ if (Math.Abs(y) < eps) { n = n + 1; x[n - 1] = z; z = z + dblステップ / 2.0; y = 関数(z); } else { z1 = z + dblStep; y1 = 関数(z1);
if (Math.Abs(y1) < eps)
{ n = n + 1; x[n - 1] = z1; z = z1 + dblStep / 2.0; y = 関数(z); else if (y * y1 > 0.0) { y = y1; z = z1; } else { js = 0; while (js == 0) { if (Math.Abs(z1 - z) < eps)
{ n = n + 1; x[n - 1] = (z1 + z) / 2.0; z = z1 + dblStep / 2.0; y = 関数(z); js = 1; } else { z0 = (z1 + z) / 2.0; y0 = 関数(z0); if (Math.Abs(y0) < eps) { x[n] = z0; n = n + 1;
js = 1;
z = z0 + dblStep / 2.0;
y = 関数(z);
else
if ((y * y0) < 0.0)
{ z1 = z0; y1 = y0; } else { z = z0; y = y0; } }
}
} }
}
// 実根の数を返す
return (n);
}
}
}