学习go语言时,遇到一种解平方根的有趣方法,牛顿法。
找来一个比较直观的图片:
我们先在一个点处做切线,然后这条切线与x轴的交点就是我们下一个做切线的位置。
如果是二次函数的话,是很简单的导数运算,切线方程:,求交点就是把y置为零就可以了。
推导出这个公式:
看图就会发现离真实的解越来越近了,多次迭代就可以得出近似值,是不是很简单?
不过牛顿法还是有限制的:
- 需要区间内,不然无法求交点
- 在x求解区间内,是连续的
Go代码
func Sqrt(x float64) float64 {
z := 1.0
for math.Abs(z*z-x) > 1e-9 {
z -= (z*z - x) / (2 * z)
}
return z
}
x是目标值,z是目标值的平方根需要被求解。
所求函数是,对z求偏导
代入
就是中间循环的内容z -= (z*z - x) / (2*z)