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