C#,码海拾贝(51)——求“实函数或复函数方程“一个复根的“蒙特卡洛法“之C#源代码

C#,码海拾贝(51)——求“实函数或复函数方程“一个复根的“蒙特卡洛法“之C#源代码_第1张图片

using System;

namespace Zhou.CSharp.Algorithm
{
    public delegate double delFunction_x(double x);
    public delegate double delFunction_xa(double[] x);
    public delegate double delFunction_x_y(double x, double y);
    public delegate double delFunction_x_ya(double x, double[] y);
    public delegate double delFunction_xa_ya(double[] x, double[] y);

    ///


    /// 求解非线性方程组的类 NLEquations
    /// 原作 周长发
    /// 改编 深度混淆
    ///

    public static partial class NLEquations
    {
 

        ///


        /// 求实函数或复函数方程一个复根的蒙特卡洛法
        /// 调用时,须覆盖计算方程左端函数的模值||f(x, y)||的虚函数
        ///          double Func(double x, double y)
        ///

        /// 计算方程左端函数
        /// 传入初值(猜测解)的实部,返回求得的根的实部
        /// 传入初值(猜测解)的虚部,返回求得的根的虚部
        /// 均匀分布的端点初值
        /// 控制参数
        /// 控制精度
        public static void GetRootMonteCarlo(delFunction_x_y Func, ref double x, ref double y, double xStart, int nControlB, double eps)
        {
            int k;
            double xx, yy, a, r, z, x1, y1, z1;

            // 求解条件与初值
            a = xStart;
            k = 1;
            r = 1.0;
            xx = x;
            yy = y;
            z = Func(xx, yy);

            // 精度控制求解
            while (a >= eps)
            {
                x1 = -a + 2.0 * a * rnd(ref r);
                x1 = xx + x1;
                y1 = -a + 2.0 * a * rnd(ref r);
                y1 = yy + y1;
                z1 = Func(x1, y1);
                k = k + 1;
                if (z1 >= z)
                {
                    if (k > nControlB)
                    {
                        k = 1;
                        a = a / 2.0;
                    }
                }
                else
                {
                    k = 1;
                    xx = x1;
                    yy = y1;
                    z = z1;
                    if (z < eps)
                    {
                        x = xx;
                        y = yy;
                        return;
                    }
                }
            }

            x = xx;
            y = yy;
        }
 

}

}

你可能感兴趣的:(C#数值计算,Numerical,Recipes,c#,数学建模,开发语言,线性代数,矩阵)