我们先来讲述牛顿迭代法的原理。
假设xk是f(x)的一个近似根,将f(x)在x处展开的多项式可表示为
f(x)=f(xk)+f’(xk)*(x-xk)+f’’(xk)*(x-xk)^2/2!+……
此处简便计算 ,以前两项近似代替f(x),则近似方程为
f(x)=f(xk)+f’(xk)*(x-xk)=0
即x=xk-f(xk)/f’(xk)
假设f(xk)!=0.则令其解为xk+1, //这里的k和k+1是下标,这个csdn'的编辑器我不知道怎么打
则有xk+1=xk-f(xk)/f’(xk)
这就是牛顿迭代法的求解方程,我们一直进行这个求解方程,直到 f(xk+1)<=flag。
flag即可理解为精度。
题目: 用牛顿迭代法求3X^3+2X^2-4X=6的解。
#include<stdio.h>
#include<math.h>
double f( double x )
{
return 3*pow(x,3)+2*pow(x,2)-4*x-6;
}
double derivative( double x ) //导数
{
return 9*pow(x,2)+4*x-4;
}
int main()
{
double flag=1E-6,x=5;
while( fabs( f(x) )>=flag ){
x-=f( x )/derivative( x );
}
printf("%lf\n",x);
return 0;
}
这里的导数我并不是用程序实现的求导,而是直接将方程的导数写上去的(因为不会,将来有机会再发一篇实现求导的博客)