牛顿迭代求sqrt函数
牛顿迭代求sqrt函数
golang_yh 发表于2年前
牛顿迭代求sqrt函数
  • 发表于 2年前
  • 阅读 69
  • 收藏 0
  • 点赞 1
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: golang刷刷小算法

经验 : 求出根号a的近似值:首先随便猜一个近似值x,然后不断令x等于x和a/x的平均数,迭代个六七次后x的值就已经相当精确了。

例如,我想求根号2等于多少。假如我猜测的结果为4,虽然错的离谱,但你可以看到使用牛顿迭代法后这个值很快就趋近于根号2了:

(       4  + 2/4        ) / 2 = 2.25

(     2.25 + 2/2.25     ) / 2 = 1.56944..

( 1.56944..+ 2/1.56944..) / 2 = 1.42189..

( 1.42189..+ 2/1.42189..) / 2 = 1.41423..

…. 

其实上面原理:就是跳跃不断逼近,因为(x+a/x)/2正好接近f(x)=x^2 的 x^2-a=0的根

这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x^2-a得到x-(x^2-a)/(2x)合并展开等于(x+a/x)/2

然后不断逼近exp的方式求根号sqrt的值

具体代码如下:

package main

import (
	"fmt"
	"math"
)

const (
	eps = 0.000001
)

func SqrtByNewton(x float64) float64 {
	var val float64 = x
	var last float64
	var cal float64
	for {
		last = val
		val = (val + x/val) / 2
		cal = math.Abs(val - last)
		if cal < eps {
			break
		}
	}
	return val
}

func main() {
	fmt.Printf("result: %v \n", math.Sqrt(4.0))
	fmt.Printf("my result: %v \n", SqrtByNewton(4.0))
}

/*
输出结果:
result: 2 
my result: 2.000000000000002
*/



  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 30
博文 86
码字总数 24924
×
golang_yh
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: