C#,码海拾贝(56)——求“非线性方程组“一组实根的“蒙特卡洛法“之C#源代码

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

    /// <summary>
    /// 求解非线性方程组的类 NLEquations
    /// 原作 周长发
    /// 改编 深度混淆
    /// </summary>
    public static partial class NLEquations
    {
 

        /// <summary>
        /// 求非线性方程组一组实根的蒙特卡洛法
        /// 计算方程左端模函数值 ||F|| 
        /// double Func(double[] x)
        /// 其返回值为Sqr(X1*X1 + X2*X2 + … + Xn*Xn)
        /// </summary>
        /// <param name="Func">计算方程左端函数</param>
        /// <param name="n">方程的个数,也是未知数的个数</param>
        /// <param name="x">一维数组,长度为n,存放一组初值x0, x1, …, xn-1, 返回时存放方程组的一组实根</param>
        /// <param name="xStart">均匀分布的端点初值</param>
        /// <param name="nControlB">控制参数</param>
        /// <param name="eps">控制精度</param>
        public static void GetRootsetMonteCarlo(delFunction_xa Func, int n, double[] x, double xStart, int nControlB, double eps)
        {
            int k, i;
            double a, r, z, z1;

            double[] y = new double[n];

            // 初值
            a = xStart;
            k = 1;
            r = 1.0;

            z = Func(x);

            // 用精度控制迭代求解
            while (a >= eps)
            {
                for (i = 0; i <= n - 1; i++)
                {
                    y[i] = -a + 2.0 * a * rnd(ref r) + x[i];
                }
                z1 = Func(y);

                k = k + 1;
                if (z1 >= z)
                {
                    if (k > nControlB)
                    {
                        k = 1;
                        a = a / 2.0;
                    }
                }
                else
                {
                    k = 1;
                    for (i = 0; i <= n - 1; i++)
                    {
                        x[i] = y[i];
                    }
                    // 求解成功
                    z = z1;
                    if (z < eps)
                    {
                        return;
                    }
                }
            }
        }
    }
}
 

猜你喜欢

转载自blog.csdn.net/beijinghorn/article/details/131316513