牛顿法求平方根
原理
计算机常用循环来计算F的平方根.从某个猜测的x值开始,根据x^2与F的近似度来调整x,产生一个更好的猜测:
x -= (x * x - F) / (2 * x)
重复调整过程,猜测的结果会越来越精确,得到的答案越发的趋近实际的平方根. 我们可以设定精度,控制计算结果与实际结果的偏差.
实现
package main import ( "fmt" "math" ) func Sqrt(F float64) float64 { x := 1.0 for math.Abs(x * x - F) > 1e-10 { x -= (x * x - F) / (2 * x); } return x } func main() { fmt.Println("牛顿法求平方根:Sqrt(10) = ", Sqrt(10)) fmt.Println("库函数求平方根:Sqrt(10) = ", math.Sqrt(10)) }
补充知识:X的平方根的golang实现
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
输入: 4
输出: 2
输入: 8
输出: 2
说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。
首先遇到这种题目肯定要想到使用内置得api来解答:
//使用api来求解 func mySqrt(x int) int { f := float64(x) ff := math.Sqrt(f) return int(ff) }
其次我们可以使用牛顿法求平方根:
牛顿法:(以本题为例子)
计算平方根,其实就是计算
x^2 =n
的解
令f(x)=x2-n,相当于求解f(x)=0的解,如上图所示。
首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。
同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。
以此类推。
以这样的方式得到的xi会无限趋近于f(x)=0的解。
判断xi是否是f(x)=0的解有两种方法:
一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。
经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f'(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。
继续化简
xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2
迭代公式就已经出来了
x = (x + n/x) / 2
那么代码:
//使用牛顿法求平方根 func mySqrt1(x int) int { res := x //牛顿法求平方根 for res*res > x { res = (res + x/res) / 2 } return res }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。如有错误或未考虑完全的地方,望不吝赐教。
Go语言,牛顿法,平方根函数
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 群星《网络最红艺人-花季雨季》2CD[WAV+CUE]
- 雷同二友《自游生物》[320K/MP3][84.64MB]
- 雷同二友《自游生物》[FLAC/分轨][417.32MB]
- shake9《悲伤剧情》[320K/MP3][79.3MB]
- 张国荣.1989-FINAL.ENCOUNTER(2024环球MQA-UHQCD限量版)【环球】【WAV+CUE】
- 阿桑.2003-受了点伤(星外星引进版)【华研国际】【WAV+CUE】
- 张舒娟.1996-昨日之歌VOL.1【荣机构】【WAV+CUE】
- 《暗喻幻想》评测:于后偏铝酸钠时代升起的新星
- 《琥珀岛》评测:采集、经营和建造的多拼套餐
- 《直到黎明》重制版评测:谁买谁是冤大头
- HOYO-MiX《崩坏3-逝去时光的海洋》[320K/MP3][89.63MB]
- HOYO-MiX《崩坏3-逝去时光的海洋》[FLAC/分轨][455.27MB]
- Dragon Beauties小龙女《爱的奇迹》[320K/MP3][30.85MB]
- 魔兽世界奥杜尔团本竞速赛奖金有多少 奥杜尔团本竞速赛奖金介绍
- 暗喻幻想大沙虫巢穴怎么过 暗喻幻想大沙虫巢穴收集攻略