用牛顿迭代法开高次方

来源:互联网 发布:矩阵的数学期望定义 编辑:程序博客网 时间:2024/06/01 08:00


牛顿迭代法

     牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。(来自百度百科)

牛顿迭代法的原理

       实际上牛顿迭代法就是将非线性的问题转化为线性问题再做处理。将非线性函数在小范围内用他的一阶泰勒级数表示(也就是在某点泰勒展开取低阶项)

设f(x)是关于x的非线性函数,函数图像如下:


对f(x)求一阶导数,得到



开二次方

      假设输入的正数为n,待求结果为x。那么问题实际上就是求函数 f(x) = x^2 - m 的零点。

对函数求导,并代入以上的结果中可以得到:


这个其实就是迭代公式。可以从函数图像上看出每次迭代后一项总是比前一项要接近函数的零点x,也就是更逼近结果。用C++实现如下:

#include <iostream>#include <math.h>using namespace std;int main(){double m,x = 1.0;cout<<"Please Input a Num:"<<endl;cin>>m;if(m < 0){cout<<"Sorry,Input is Illegal"<<endl;}else if(m == 0){    cout<<"0"<<endl;}else{while(fabs(m - (x*x)) >= 0.001){x = (x + m/x)/2.0;cout<<"x="<<x<<"\tm="<<m<<endl;      //显示运算过程}cout<<"The result is:"<<x<<endl;}system("pause");}
运行结果:



开三次方

   和开二次方相同,对函数求导带入,得到迭代公式:


程序中仅对迭代公式进行修改即可实现了:(不同于二次方,三次方可以得到正负数,其实开的的结果和被开方数符号相同,这里不作修改了,仅仅改改迭代公式看看结果)

#include <iostream>#include <math.h>int main(){double m,x = 1.0;cout<<"Please Input a Num:"<<endl;cin>>m;if(m < 0){cout<<"Sorry,Input is Illegal"<<endl;}else if(m == 0){cout<<"0"<<endl;}else{while(fabs(m - (x*x*x)) >= 0.001){x = (2*x + m/(x*x))/3.0;cout<<"x="<<x<<"\tm="<<m<<endl;      //显示运算过程}cout<<"The result is:"<<x<<endl;}system("pause");}

看看运行结果:



总结

      牛顿迭代的方法其实就是线性逼近,一般用在求解方程上,对于有些方程是非常有效。当然,开方的实现实际上还是由求解方程的根来实现的。




0 0
原创粉丝点击