牛顿迭代法是求解一元非线性方程根的方法中非常重要、且比较快速的一种。它把f(x)作一阶泰勒级数展开,将非线性方程的求根问题转化为求解一系列线性方程的根。
牛顿迭代法的迭代公式如下:
牛顿迭代法的基本步骤如下:
#include <stdio.h>
#include <math.h>
#define eps 0.00001 /* 容许误差*/
float f(float x) /* 定义函数f(x) */
{
return pow(x,3)+2*x+40-exp(x);
}
float f1(float x) /* 定义函数f(x)的导数*/
{
return 3*pow(x,2)+2-exp(x);
}
main()
{
float x0,x1;
int N=0;/*统计迭代次数*/
printf("Please input x0:\n");
scanf("%f",&x0);/*输入初始值x0*/
do
{
N++;
x1=x0-f(x0)/f1(x0); /* 牛顿迭代*/
x0=x1; /* 准备下一次迭代的初值*/
}while(fabs(x1-x0)>eps || fabs(f(x1))>eps ); /*满足精度,输出近似根*/
printf("x=%f, NO.=%d\n",x1,N);
system("pause");
}
使用牛顿迭代法时,初值的选择很重要,会直接影响迭代次数;当方程f(x)=0有多重根时,输入不同的迭代初值x0,很可能会得到不同的计算结果(即不同的根)。
牛顿迭代法要求先推导得到f(x)的导数,因此不适用于f(x)求导比较复杂的情况。
参考资料:
[1] 王汉青. 暖通空调流体流动数值计算方法与应用[M]. 北京: 科学出版社, 2013.10.