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>
/// 求实系数代数方程全部根的QR方法
/// </summary>
/// <param name="n">多项式方程的次数
/// <param name="dblCoef">一维数组,长度为n+1,按降幂次序依次存放n次多项式方程的 n+1个系数</param>
/// <param name="xr">一维数组,长度为n,返回n个根的实部</param>
/// <param name="xi">一维数组,长度为n,返回n个根的虚部</param>
/// <param name="nMaxIt">迭代次数</param>
/// <param name="eps">精度控制参数</param>
/// <return>bool 型,求解是否成功</return>
public static bool GetRootQr(int n, double[] dblCoef, double[] xr, double[] xi, int nMaxIt, double eps)
{
// 初始化矩阵
Matrix mtxQ = new Matrix();
mtxQ.Init(n, n);
double[] q = mtxQ.GetData();
// 构造赫申伯格矩阵
for (int j = 0; j <= n - 1; j++)
{
q[j] = -dblCoef[n - j - 1] / dblCoef[n];
}
for (int j = n; j <= n * n - 1; j++)
{
q[j] = 0.0;
}
for (int i = 0; i <= n - 2; i++)
{
q[(i + 1) * n + i] = 1.0;
}
// 求赫申伯格矩阵的特征值和特征向量,即为方程的解
if (Matrix.ComputeEvHBerg(mtxQ, out xr, out xi, nMaxIt, eps))
{
return true;
}
return false;
}
}
}