1. 程式人生 > >牛頓迭代法實現平方根函式sqrt

牛頓迭代法實現平方根函式sqrt

 給定一個正數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,至於逼近到什麼時候才算完,這個取決於你自己設定的精度。整個過程的迭代只需要幾步就可以求得最終的結果。

程式碼如下:

  1. double NewtonMethod(double fToBeSqrted)  
  2. {  
  3.     double x = 1.0;  
  4.     while(abs(x*x-fToBeSqrted) > 1e-5)  
  5.     {  
  6.         x = (x+fToBeSqrted/x)/2;  
  7.     }  
  8.     return x;  
  9. }  

當然,從圖中可以看出,當你所取的初始值的橫座標在紅色曲線與x軸交點右邊,即比最終的結果大時,比如選初始值x=a,我們可以將while語句裡面的abs(x*x-fToBeSqrted)直接換成fToBeSqrted -x*x,這樣可以省去abs的運算。當然這不能確保效率的提升,因為初始值的選取直接影響了迭代的次數。