一部分是网上的 牛顿迭代法(Newton's method)又称为牛顿-拉夫逊方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。方法使用函数f(x)的泰勒级数的前面几项来寻找方程f(x) = 0的根。牛顿迭代法是求方程根的重要方法之一,其最大优点是在方程f(x) = 0的单根附近具有平方收敛,而且该法还可以用来求方程的重根、复根。另外该方法广泛用于计算机编程中。
方法简介 解非线性议程f(x)=0的牛顿法是把非线性方程线性化的一种近似方法。
把f(x)在x0点附近展开成泰勒级数 f(x)=f(x0)+(x-x0)fˊ(x0)+(x-x0)2 +… 取其线性部分
,作为非线性方程f(x)=0的近似方程,则有 f(x0)+fˊ(x0)(x-x0)=0 设fˊ(x0)≠0则其解为 x1=x0-f(x0)/fˊ(x0) 再把f(x)在x1附近展开成泰勒级数,也取其线性部分作f(x)=0的近似方程。若f(x1)≠0,则得 x2=x1-f(x1)/fˊ(x1) 这样,得到牛顿法的一个迭代序列 xn+1=xn-f(xn)/fˊ(xn) 当Xn==Xn+1或异常接近的时候,f(Xn)/f`(Xn)=0;即F(Xn)=0;
代码 #include
main(){
float x,x0,d,f,fd;
scanf("%f",&x0); do { f=f(x);
f1=psi(f);//derivation of f(x) d=f/f1;
x=x0-d; x0=x; } while(fabs(d)>elapsion);
printf("x=%f/n",x); } 下面转载 QQ327293351 CSDN blog
#include #include
#define Precision 0.000001 //控制精度要求
#define MaxIterative 60 //最大允许迭代次数
void function(double &x,double &y0,double &y1) { y0=x*x*x-3*x-1.0;//原函数 y1=3.0*x*x-3; //函数导数 } double NewtonIterative (double &x,void f(double &x,double &y0,double &y1)) { int MI; double y0,y1,PCS,x0,x1,PCSy;//MI均来计算迭代的次数,PCS表示x0与x1的差,PCSy表示x1对应的y的绝对值 MI=MaxIterative; x0=x; f(x0,y0,y1); //先运行一次,计算出y0,y1 PCS=Precision+1.0; while ((PCS>=Precision)&&(MI!=0))//结束迭代过程的条件,x,y { if (fabs(y1+1.0==1.0))//判断导数是否为0 { cout<<"wrong"; return -1; } x1=x0-y0/y1; //迭代计算x1=x0-f(x0)/f'(x0); f(x1,y0,y1); PCS=fabs(x1-x0); PCSy=fabs(y0); if(PCSy>PCS) PCS=PCSy; x0=x1; MI=MI-1; } x=x1; //把最后求出的结果付给x return MaxIterative-MI;//迭代的次数 } main() { int k; double x; cout<<"请输入在所求根附近估计x0的值"<>x; k=NewtonIterative (x,function); if (k>=0) { cout<<"一共迭代了"<<<"次"<<<"方程的近似根为"<<