算法描述如下:
给定初始值x0,ε为根的容许误差,η为 | f(x) | 的容许误差,N为迭代次数的容许值。
1.如果 f'(x0)=0 或迭代次数大于N,则算法失败,结束;否则执行2。
2.计算x1=x0-f(x0)/f'(x0)。
3.若| x1-x0 |<ε 或| f(x1) |<η ,则输出x1,程序结束;否则执行4。
4.令x0=x1,转向1
程序实例(c语言实现)
求方程xe(x) - 1 = 0 的根
- /*牛顿迭代法*/
- #include <stdio.h>
- #include <math.h>
- #define N 100
- #define eps 1e-6
- #define eta 1e-8
- float Newton(float(*f)(float),float(*fl)(float),float x0)
- {
- float x1,d;
- int k=0;
- do
- {
- x1=x0-(*f)(x0)/(*fl)(x0);
- if(k++>N || fabs((*fl)(x1))<eps)
- {
- printf("/n Newton 迭代发散");
- break;
- }
- d=fabs(x1)<1?(x1-x0):(x1-x0)/x1; //计算误差值
- x0=x1;
- printf("x(%d)=%f/t",k,x0);
- }
- while(fabs(d)>eps && fabs((*f)(x1))>eta);
- return x1;
- }
- float f(float x)
- {
- return x*exp(x)-1;
- }
- float fl(float x)
- {
- return exp(x)+x*exp(x);
- }
- void main()
- {
- float x0,y0;
- printf("请输入迭代初值 x0/n");
- scanf("%f",&x0);
- printf("x0=%f/n",x0);
- y0=Newton(f,fl,x0);
- printf("方程的根为: %f/n",y0);
- }
输出:
请输入迭代初值 x0
1.0
x0=1.000000
x(1)=0.683940 x(2)=0.577454 x(3)=0.567230 x(4)=0.567143 x(5)=0.567143
方程的根为: 0.567143