utilizando el sistema;
espacio de nombres Zhou.CSharp.Algorithm
{ delegado público double delFunction_x(doble x); delegado publico double delFunction_xa(doble[] x); delegado publico double delFunction_x_y(doble x, doble y); delegado público double delFunction_x_ya(doble x, doble[] y); delegado público doble delFunction_xa_ya(doble[] x, doble[] y);
/// <summary>
/// Class NLEquations para resolver ecuaciones no lineales
/// Zhou Changfa
/// Adaptado a la confusión profunda
/// </summary>
public static parcial class NLEquations
{
/// <summary>
/// Método de Monte Carlo para encontrar una raíz real de una ecuación no lineal
/// Calcula la función f(x) en el lado izquierdo de la ecuación double Func(double x)
/// </summary >
/// <param name="Func">Calcula la función del extremo izquierdo de la ecuación</param>
/// <param name="x">Ingresa el valor inicial (adivina la solución) y devuelve la raíz real obtenida </param>
/// <param name ="xStart">El valor inicial del punto final de la distribución uniforme</param>
/// <param name="nControlB">Parámetros de control</param>
/// < param name="eps">Precisión de control</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 ;
// Condición de resolución
a = xStart,
k = 1,
r = 1.0;
// valor inicial
xx = x,
y = Func(xx);
// solución de control de precisión
while (a >= eps)
{ x1 = rnd(ref r);
x1 = -a + 2.0 * a * x1;
x1 = xx + x1;
y1 = Func(x1);
k = k + 1;
if (Math.Abs(y1) >= Math.Abs(y))
{ if (k > nControlB) { k = 1; a = a / 2.0; } } más { k = 1; xx = x1; y = y1; if (Math.Abs(y) < eps) { x = xx; devolver; } } }
x = xx;
}
/// <summary>
/// 内部函数
/// </summary>
private static double rnd(ref double r)
{ double s = 65536.0; doble u = 2053,0; doble v = 13849,0; int m = (int)(r/s); r = r - metro * s; r = tu * r + v; m = (int)(r/s); r = r - metro * s; doble p = r/s; retorno (p); }
}
}