牛顿法求解平方根(一种计算机实现开根的方式)

前言

最近看到一个非常有趣的方法,叫做牛顿法,可以用于求解一个数的平方根,当然可以扩展到求实数或复数域。

牛顿法

话不多说直接上图,一目了然。
牛顿法
我们先在一个点 x n x_n xn处做切线,然后这条切线与x轴的交点 x n + 1 x_{n+1} xn+1就是我们下一个做切线的位置。

如果是二次函数的话,是很简单的导数运算,切线方程: y = f ′ ( x n ) ( x − x n ) + f ( x n ) y = f'(x_n)(x - x_n) + f(x_n) y=f(xn)(xxn)+f(xn),求交点就是把y置为零就可以了。

推导出这个公式-------> x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)!!

看图就会发现离真实的解越来越近了,多次迭代就可以得出近似值,是不是很简单?

不过牛顿法还是有限制的:

  1. 需要区间内 f ′ ( x ) f'(x) f(x)≠0,不然无法求交点
  2. 在x求解区间内, f ′ ′ ( x ) f''(x) f(x)是连续的

Go代码

语言大同小异,其实还是比较容易看懂的,就是循环了十次,当然次数越多越逼近啊!

func Sqrt(x float64) float64 {
	z := 1.0
	for i := 1; i <= 10; i++ {
		z -= (z*z - x) / (2*z)
	}
	return z
}

x是目标值,z是目标值的平方根需要被求解。

所求函数是 f ( z , x ) = z 2 − x f(z,x)=z^2-x f(z,x)=z2x,对z求偏导 ∂ f ( z , x ) ∂ z = 2 z \frac{\partial f(z,x)}{\partial z}=2z zf(z,x)=2z

代入 x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_n-\frac{f(x_n)}{f&#x27;(x_n)} xn+1=xnf(xn)f(xn)就是中间循环的内容z -= (z*z - x) / (2*z)


参考链接:

  1. https://zh.wikipedia.org/wiki/牛顿法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值