Newton-Rapshon 迭代法

一部分是网上的  牛顿迭代法(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<<"一共迭代了"<<<"次"<<<"方程的近似根为"<<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值