牛頓迭代公式
阿新 • • 發佈:2018-12-16
問題背景
給定任意一個數x,求其平方根z,平方誤差小於0.001。
這個問題直觀的去想,我們一般會採取設定一個初始值,然後通過迭代逐漸逼近平方根,但是初始值怎樣去迭代才能更快”逼近“成為關鍵問題,牛頓迭代公式從數學角度給這類問題提供了理論支撐。
牛頓迭代公式
對於牛頓公式的理論,我們引用百度百科的說明
程式碼實現
理解了牛頓迭代公式,其實結論就是,這個也是迭代“逼近”的演算法。對於我們求平方根的需求,,迭代演算法就是:z = z - (z*z - x)/(2*z),但是到底迭代多少次需要我們自己控制,可以控制迭代次數或者達到一定精度後停止迭代。下面給出go的實現:
Newton's method to compute the square root most nearly. */ func Sqrt(x float64) float64 { fmt.Println("**********Test - get the square root*********") z := float64(1) for i := 0; math.Abs(z*z - x) > 0.001; i++ { z -= (z*z - x) / (2*z) fmt.Println("iterator order: ", i, ", x: ", z) } return z }
以200作為輸入的結果:
**********Test - get the square root********* iterator order: 0 , x: 100.5 iterator order: 1 , x: 51.245024875621894 iterator order: 2 , x: 27.573921384195742 iterator order: 3 , x: 17.41357580449592 iterator order: 4 , x: 14.44943381958916 iterator order: 5 , x: 14.145403301286928 iterator order: 6 , x: 14.142136001158033 14.142136001158033