1. 程式人生 > >牛頓迭代公式

牛頓迭代公式

問題背景

給定任意一個數x,求其平方根z,平方誤差小於0.001。

這個問題直觀的去想,我們一般會採取設定一個初始值,然後通過迭代逐漸逼近平方根,但是初始值怎樣去迭代才能更快”逼近“成為關鍵問題,牛頓迭代公式從數學角度給這類問題提供了理論支撐。

牛頓迭代公式

對於牛頓公式的理論,我們引用百度百科的說明

程式碼實現

理解了牛頓迭代公式,其實結論就是x_{n+1}=x_{n} - f(x_{n})/f^{'}(x_{n}),這個也是迭代“逼近”的演算法。對於我們求平方根的需求,f(z)=z^{^{2}} - x,迭代演算法就是: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