这次来尝试使用Aitken法寻找方程实根,Aitken是迭代加速方法中的一种.

  • 假设非线性方程为x=f(x)
  • 一次迭代为u=f(xn)
  • 同时得到v=f(xu)
  • xn+1 = v-(v-u)2/(v-2u+xn)
  • 当u和v的差值在容差之内,则认为v为方程的一个实根

Aitken的收敛速度会比常规的迭代方法略快.
参考代码如下:

/// <summary>
/// Aitken求解非线性方程的一个实根
/// </summary>
/// <param name="func">要求解的方程函数</param>
/// <param name="maxItCount">最大迭代次数</param>
/// <param name="eps">容差</param>
/// <param name="x">根的初始值,预估计一个更接近于根的实际值的初始值</param>
public static double Aitken(SimpleEquation func, double eps, double x,int maxItCount)
{
    double u, v, x0 = x;
    int i =0;
    for (i = 0; i < maxItCount;i++ )
    {
        u = func(x0);
        v = func(u);
        if (System.Math.Abs(u - v) < eps)
        {
            x0 = v;
            break;
        }
        else
            x0 = v - (v - u) * (v - u) / (v - 2.0 * u + x0);
    }
    if (i == maxItCount)
        throw new Exception("迭代不收敛!");
    return x0;
}

用方程验证在1.5附近的实根

验证代码如下:

static void Main(string[] args)
{
    Console.WriteLine(Aitken(Func,0.00000001,1.5,50));
}

public static double Func(double x)
{
    return -(2*x*x*x-2*x*x-3);
}

运行结果为
1.40445153631998

如果你喜欢这样的文章, 请 订阅我的RSS feed吧 !