埃特金(Aitken)迭代法(适用于一元非线性方程的求根问题)可以有效加快迭代过程的收敛速度。埃特金迭代公式如下:
埃特金迭代法的基本步骤如下:
#include <stdio.h>
#include <math.h>
float g(float x) /* 定义函数f(x) */
{
return 0.5*exp(x)-0.5*pow(x,3)-20;
}
#define N 1000 /* 最大迭代次数N */
#define eps 0.00001 /* 容许误差*/
main()
{
float x0,x1;/* 分别存放相邻两次迭代值*/
float y,z;/* 分别存放预迭代值*/
int i;
printf("input x0:\n");
scanf("%f",&x0);
for(i=1;i<=N;i++)
{
y=g(x0);
z=g(y);
x1=z-((z-y)*(z-y))/(z-2*y+x0); /* 埃特金迭代公式*/
if(fabs(x1-x0)<eps && fabs(g(x1)-x1)<eps) /*若满足精度要求,输出近似根并退出*/
{
printf("Root of equation:%f, NO.=%d\n",x1,i);
system("pause");
return;
}
x0=x1; /* 准备下一次迭代的初值*/
}
printf("After %d repeats, no root was soloved.\n",N);
system("pause");
}
埃特金迭代法可以有效加快迭代过程的收敛速度,这是其优点,但也可能成为其缺点。因为,当方程x=g(x)有多个实数根时,有可能造成部分实数根难以被求解出来(如例题中,-3.224、5.29均为方程实数根,但是输入x0=5,却计算得到-3.224)。因此,埃特金迭代法更适用于方程计算量大,且方程只有一个实数根或者虽然方程有多个实数根但相邻实数根间距较大的一元非线性方程。
此外,由于埃特金迭代法需要经过两次预计算(y=g(x0),z=g(y)),它不适用于z=g(y)计算结果极大的情况(会造成计算结果溢出)。
参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.
搜索