sqrt()平方根計算函數的實現2——牛頓迭代法


牛頓迭代法:

      牛頓迭代法又稱為牛頓-拉夫遜方法,它是牛頓在17世紀提出的一種在實數域和復數域上近似求解方程的方法。多數方程不存在求根公式,因此求精確根非常困難,甚至不可能,從而尋找方程的近似根就顯得特別重要。方法使用函數f(x)的泰勒級數的前面幾項來尋找方程f(x) = 0的根。牛頓迭代法是求方程根的重要方法之一,其最大優點是在方程f(x) = 0的單根附近具有平方收斂,而且該法還可以用來求方程的重根、復根,此時線性收斂,但是可通過一些方法變成超線性收斂。另外該方法廣泛用於計算機編程中。

牛頓迭代公式:

     設r是f(x) = 0的根,選取x0作為r初始近似值,過點(x0,f(x0))做曲線y = f(x)的切線L,L的方程為y = f(x0)+f'(x0)(x-x0),求出L與x軸交點的橫坐標 x1 = x0-f(x0)/f'(x0),稱x1為r的一次近似值。過點(x1,f(x1))做曲線y = f(x)的切線,並求該切線與x軸交點的橫坐標 x2 = x1-f(x1)/f'(x1),稱x2為r的二次近似值。重復以上過程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),稱為r的n+1次近似值,上式稱為牛頓迭代公式

牛頓迭代法求平方根:

     求平方根在牛頓迭代公式中,f(x)=x^2-a,則f'(x)=2x。以上的牛頓迭代公式變為:x(n+1)=x(n)-(x(n)^2-a)/2x,即(x(n)+a/x(n))/2。我們隨便猜一個數r,假設r是f(x)=0的根,經過幾次牛頓迭代公式后(以上的公式)所得到的x值即是f(x)=0的根或者其非常精確的近似值。

例如:我想求根號2等於多少。假如我猜測的結果為4,雖然錯的離譜,但你可以看到使用牛頓迭代法后這個值很快就趨近於根號2了:
      ( 4  + 2/4 ) / 2 = 2.25
      ( 2.25 + 2/2.25 ) / 2 = 1.56944..
      ( 1.56944..+ 2/1.56944..) / 2 = 1.42189..
      ( 1.42189..+ 2/1.42189..) / 2 = 1.41423..

盜圖一張以作說明,圖片來自http://www.2cto.com/kf/201206/137256.html。

..\

 

程序實現:

#include<iostream>

#include<math.h>

using namespace std;

double sqrtNT(double a,double b)

{

       double x,last;

       x=b;

       if(a<=0)

       {

              return a;

       }

       while(x*x!=a&&(abs(last-x)>0.0000001))

       {

              last=x;

              x=(x+a/x)/2;

       }

       return x;

}

int main()

{

       cout<<sqrtNT(93273,5)<<endl;

       return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM