Go語言實現牛頓法求平方根函式的案例
牛頓法求平方根
原理
計算機常用迴圈來計算F的平方根.從某個猜測的x值開始,根據x^2與F的近似度來調整x,產生一個更好的猜測:
x -= (x * x - F) / (2 * x)
重複調整過程,猜測的結果會越來越精確,得到的答案越發的趨近實際的平方根. 我們可以設定精度,控制計算結果與實際結果的偏差.
實現
package main import ( "fmt" "math" ) func Sqrt(F float64) float64 { x := 1.0 for math.Abs(x * x - F) > 1e-10 { x -= (x * x - F) / (2 * x); } return x } func main() { fmt.Println("牛頓法求平方根:Sqrt(10) = ",Sqrt(10)) fmt.Println("庫函式求平方根:Sqrt(10) = ",math.Sqrt(10)) }
補充知識:X的平方根的golang實現
實現 int sqrt(int x) 函式。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。
輸入: 4
輸出: 2
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,由於返回型別是整數,小數部分將被捨去。
首先遇到這種題目肯定要想到使用內建得api來解答:
//使用api來求解 func mySqrt(x int) int { f := float64(x) ff := math.Sqrt(f) return int(ff) }
其次我們可以使用牛頓法求平方根:
牛頓法:(以本題為例子)
計算平方根,其實就是計算
x^2 =n
的解
令f(x)=x2-n,相當於求解f(x)=0的解,如上圖所示。
首先取x0,如果x0不是解,做一個經過(x0,f(x0))這個點的切線,與x軸的交點為x1。
同樣的道理,如果x1不是解,做一個經過(x1,f(x1))這個點的切線,與x軸的交點為x2。
以此類推。
以這樣的方式得到的xi會無限趨近於f(x)=0的解。
判斷xi是否是f(x)=0的解有兩種方法:
一是直接計算f(xi)的值判斷是否為0,二是判斷前後兩個解xi和xi-1是否無限接近。
經過(xi,f(xi))這個點的切線方程為f(x) = f(xi) + f'(xi)(x - xi),其中f'(x)為f(x)的導數,本題中為2x。令切線方程等於0,即可求出xi+1=xi - f(xi) / f'(xi)。
繼續化簡
xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2
迭代公式就已經出來了
x = (x + n/x) / 2
那麼程式碼:
//使用牛頓法求平方根 func mySqrt1(x int) int { res := x //牛頓法求平方根 for res*res > x { res = (res + x/res) / 2 } return res }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。