システムを使用する;
名前空間 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>
/// 非線形方程式の実根を求めるモンテカルロ法
/// 方程式の左辺の関数 f(x) を計算します double Func(double x)
/// </summary >
/// <param name="Func">方程式の左端関数を計算します</param>
/// <param name="x">初期値を入力(解を推測)し、得られた実根を返します</param>
/// <param name ="xStart">一様分布の終点の初期値</param>
/// <param name="nControlB">制御パラメータ</param>
/// < param name="eps">制御精度</param>
public static void GetRootMonteCarlo(delFunction_x Func, ref double x, double xStart, int nControlB, double eps)
{ int k; double xx, a, y, x1, y1, r ;
// 解決条件
a = xStart;
k = 1;
r = 1.0;
// 初期値
xx = x;
y = Func(xx);
// 精度制御ソリューション
while (a >= eps)
{ x1 = rnd(ref r);
x1 = -a + 2.0 * a * x1;
x1 = xx + x1;
y1 = 関数(x1);
k = k + 1;
if (Math.Abs(y1) >= Math.Abs(y))
{ if (k > nControlB) { k = 1; a = a / 2.0; } } else { k = 1; xx = x1; y = y1; if (Math.Abs(y) < eps) { x = xx; 戻る; } } }
x = xx;
}
/// <summary>
/// 内部関数数
/// </summary>
private static double rnd(ref double r)
{ double s = 65536.0; ダブル u = 2053.0; ダブル v = 13849.0; int m = (int)(r / s); r = r - m * s; r = u * r + v; m = (int)(r / s); r = r - m * s; ダブル p = r / s; リターン (p); }
}
}