牛顿迭代公式

问题背景

给定任意一个数x,求其平方根z,平方误差小于0.001。

这个问题直观的去想,我们一般会采取设定一个初始值,然后通过迭代逐渐逼近平方根,但是初始值怎样去迭代才能更快”逼近“成为关键问题,牛顿迭代公式从数学角度给这类问题提供了理论支撑。

Newton迭代公式

对于Newton公式的理论,我们引用百度百科的说明

代码实现

理解了牛顿迭代公式,其实结论就是x_{n+1}=x_{n} - f(x_{n})/f^{'}(x_{n}),这个也是迭代“逼近”的算法。对于我们求平方根的需求,f(z)=z^{^{2}} - x,迭代算法就是:z = z - (z*z - x)/(2*z),但是到底迭代多少次需要我们自己控制,可以控制迭代次数或者达到一定精度后停止迭代。下面给出go的实现:

/*
Newton's method to compute the square root most nearly.
*/
func Sqrt(x float64) float64 {
	fmt.Println("**********Test - get the square root*********")
	z := float64(1)
	for i := 0; math.Abs(z*z - x) > 0.001; i++ {
		z -= (z*z - x) / (2*z)
		fmt.Println("iterator order: ", i, ", x: ", z)
	}
	return z
}

以200作为输入的结果:

**********Test - get the square root*********
iterator order:  0 , x:  100.5
iterator order:  1 , x:  51.245024875621894
iterator order:  2 , x:  27.573921384195742
iterator order:  3 , x:  17.41357580449592
iterator order:  4 , x:  14.44943381958916
iterator order:  5 , x:  14.145403301286928
iterator order:  6 , x:  14.142136001158033
14.142136001158033

 

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值