当前位置 博文首页 > Go语言实现牛顿法求平方根函数的案例

    Go语言实现牛顿法求平方根函数的案例

    作者:Valars 时间:2021-02-09 06:28

    牛顿法求平方根

    原理

    计算机常用循环来计算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
    }

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持站长博客。如有错误或未考虑完全的地方,望不吝赐教。

    js
    下一篇:没有了