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(x, y)||的虚函数
/// double Func(double x, double y)
/// </summary>
/// <param name="Func">计算方程左端函数</param>
/// <param name="x">传入初值(猜测解)的实部,返回求得的根的实部</param>
/// <param name="y">传入初值(猜测解)的虚部,返回求得的根的虚部</param>
/// <param name="xStart">均匀分布的端点初值</param>
/// <param name="nControlB">控制参数</param>
/// <param name="eps">控制精度</param>
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;
}
}
}