牛顿迭代法
牛顿迭代法的思想是将非线性函数(原方程)线性化(切线方程),以线性方程的解逐步逼近非线性方程的解。
算法步骤
步骤1:设x*是f(x)= 0 的根,选取x0作为x*初始近似值,并设f(x), f’(x)和f’’(x) 在x*附近连续。过点(x0,f(x0)) 做曲线y=f(x)的切线L,L的方程为y=f(x0)+f’(x0)(x-x0) ,这里其实是f(x)在x0处的一阶Taylor展开,求出L与x轴交点的横坐标x1= x0-f(x0)/f’(x0) ,称x1 为x0 的一次近似值。
步骤2:过点(x1,f(x1)) 做曲线 的切线,并求该切线与x轴交点的横坐标 x2= x1-f(x1)/f’(x1) ,称x2为x*的二次近似值。
步骤3:重复以上过程,得 x*的近似值序列xk+1= xk-f(xk)/f’(xk),其中xk+1,称为 的k+1次近似值,上式称为牛顿迭代公式。
步骤4:在迭代序列收敛的情况下,取满足精度的迭代值 xk作为方程的根x* 的近似值。
算法流程
例题
用牛顿迭代法求解方程x3-3x-1=0 在x0=2 附近的根,精确到小数点后第四位。
代码实现
#include "stdio.h"
#include "math.h"
main()
{
float x0,x1=2;
int i=0;
printf("\nx%d=%7.6f",i,x1);
i++;
do
{
x0=x1;
x1=x0-(x0*x0*x0-3*x0-1)/(3*x0*x0-3); //代码求导搞不定,只能手动求导了,囧~
printf("\nx%d=%7.6f",i,x1);
i++;
}while(fabs(x1-x0)>=0.000001);
printf("\nx=%5.5f",x1);
}