C#, código Haishibei (50): el código fuente C# del "método Monte Carlo" para encontrar una raíz real de la "ecuación no lineal"

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);         }











 

}

}

Supongo que te gusta

Origin blog.csdn.net/beijinghorn/article/details/131233958
Recomendado
Clasificación