如有:f(x) = x2 - 2眷茁,求其正根。
曲線與切線的關(guān)系:切線是曲線的線性逼近纵诞。即上祈,在曲線上某點(diǎn)附近,經(jīng)過此點(diǎn)的切線,可以看成曲線的近似登刺。
由以上結(jié)論籽腕,曲線上任意一個(gè)點(diǎn),都可以用切線來近似表示纸俭。那如何通過程序求出剛開始提出的方程的根皇耗。即求:x2 - 2 = 0 時(shí)的解,也就是2的開方揍很。
首先郎楼,并不知道曲線與x軸的交點(diǎn)在哪里,因此窒悔,需要選擇一個(gè)迭代的初始值呜袁。假設(shè)這個(gè)值為xn,即在曲線上選取一點(diǎn)简珠,經(jīng)過這個(gè)點(diǎn)做切線阶界,切線與x軸相交于點(diǎn)(xn+1, 0)。切線方程為:f(xn) + f'(xn)(x - xn)北救。求切線方程的解荐操,多次迭代之后,值會(huì)收斂于某個(gè)點(diǎn)附近珍策,這個(gè)值就是近似結(jié)果托启。
即:xn+1 = xn - f(xn) / f'(xn)
依次求出 x1, x2, x3 ......
求 √2,對(duì)曲線方程求導(dǎo)攘宙,得 f'(x) = 2x
則 xn+1 = xn - (xn2 - 2) / 2xn
以下為go語言的實(shí)現(xiàn):
func Sqrt(x float64) float64 {
//初始值為1
z := 1.0
var result float64
//只迭代了十次屯耸,可改進(jìn)為計(jì)算是否改變或者改變很小時(shí)退出循環(huán)
for i := 0; i < 10; i ++ {
result = (z + x / z) / 2
z = result
}
return result
}
func main() {
fmt.Println(Sqrt(2))
}
輸出:1.414213562373095