• 牛顿迭代法求根


    给定一个正数a,不用库函数求其平方根。

           设其平方根为x,则有x2=a,即x2-a=0。设函数f(x)= x2-a,则可得图示红色的函数曲线。在曲线上任取一点(x0,f(x0)),其中x0≠0那么曲线上该点的切线方程为

                                 (1-1)

           求该切线与x轴的交点得

                                (1-2)

     

          因为1-2式中x0作为分母,所以在之前限定了一下初始值不要选0。那么得到的这个与x轴的交点其实是最终要求得的x的一次逼近,我们再以这个x基准继续迭代就可以求得更逼近的x,至于逼近到什么时候才算完,这个取决于你自己设定的精度。整个过程的迭代只需要几步就可以求得最终的结果。

       

    代码如下:

    #include<iostream>
    using namespace std;
    #include<cmath>
    double NewtonMethod(double fToBeSqrted)
    {
    	double x = 1.0;
    	while(fabs(x*x-fToBeSqrted) > 1e-8)
    	{
    		x = (x+fToBeSqrted/x)/2;
    	}
    
    	return x;
    }
    int main(){
    
     double n;
     while(cin>>n){
    
    cout<<NewtonMethod(n)<<endl;
     }
     return 0;
    }


    当然,从图中可以看出,当你所取的初始值的横坐标在红色曲线与x轴交点右边,即比最终的结果大时,比如选初始值x=a,我们可以将while语句里面的abs(x*x-fToBeSqrted)直接换成fToBeSqrted -x*x,这样可以省去abs的运算。当然这不能确保效率的提升,因为初始值的选取直接影响了迭代的次数。

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    today lazy . tomorrow die .
  • 相关阅读:
    IOS开发-OC学习-MD5加密
    数据可视化-使用EXCEL和PS制作一个复杂饼图
    IOS开发-OC学习-Foundation框架练习
    IOS开发-ObjC-NSDictionary
    IOS开发-ObjC-NSArray
    IOS开发-ObjC-NSString
    Java for LeetCode 213 House Robber II
    Java for LeetCode 212 Word Search II
    Java for LeetCode 211 Add and Search Word
    Java for LeetCode 210 Course Schedule II
  • 原文地址:https://www.cnblogs.com/france/p/4808750.html
Copyright © 2020-2023  润新知