如有:f(x) = x2 - 2,求其正根。
曲线与切线的关系:切线是曲线的线性逼近。即,在曲线上某点附近,经过此点的切线,可以看成曲线的近似。
由以上结论,曲线上任意一个点,都可以用切线来近似表示。那如何通过程序求出刚开始提出的方程的根。即求:x2 - 2 = 0 时的解,也就是2的开方。
首先,并不知道曲线与x轴的交点在哪里,因此,需要选择一个迭代的初始值。假设这个值为xn,即在曲线上选取一点,经过这个点做切线,切线与x轴相交于点(xn+1, 0)。切线方程为:f(xn) + f'(xn)(x - xn)。求切线方程的解,多次迭代之后,值会收敛于某个点附近,这个值就是近似结果。
即:xn+1 = xn - f(xn) / f'(xn)
依次求出 x1, x2, x3 ......
求 √2,对曲线方程求导,得 f'(x) = 2x
则 xn+1 = xn - (xn2 - 2) / 2xn
以下为go语言的实现:
func Sqrt(x float64) float64 {
//初始值为1
z := 1.0
var result float64
//只迭代了十次,可改进为计算是否改变或者改变很小时退出循环
for i := 0; i < 10; i ++ {
result = (z + x / z) / 2
z = result
}
return result
}
func main() {
fmt.Println(Sqrt(2))
}
输出:1.414213562373095