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

牛顿法求平方根

原理

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

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

(0)

相关推荐

  • 使用go求幂的几种方法小结

    我就废话不多说了,大家还是直接看代码吧~ /* * 二分幂法 求x^n */ // 求整数幂 package main import ( "fmt" "math" ) func main() { var x float64 var n int fmt.Scanf("%f%d", &x, &n) fmt.Println(powerf(x, n)) fmt.Println(powerf2(x, n)) fmt.Println(powe

  • golang切片反序实例

    看代码吧~ package main import ( "fmt" ) func main() { fmt.Println(reverse([]byte{11,22,33,44})) } func reverse(s []byte) []byte { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i], s[j] = s[j], s[i] } return s } 补充:golang切片内存应用技巧 在 Go 语言中切片是

  • 浅谈Go语言中的次方用法

    Go语言中符号 " ^ " 不再用于次方,而是表示"按位异或的运算" 具体的运算规则如下: 按位异或 ^ : 两位一个为 0, 一个为 1 ,结果为 1 ,否则为 0(位表示二进制的机器码) 例子如下: 所以Go语言中2^3 = 1 不是 8(注意:计算机都是按照补码进行运算) 那么Go语言中的次方是什么:(下图所示) (官方文档是个好帮手) 补充:leetcode golang实现一个数的整数次方 pow(x, n) 我就废话不多说了,大家还是直接看代码吧~ pa

  • Golang 运算符及位运算详解

    什么是运算符? 运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算.例如:2+3,其操作数是2和3,而运算符则是"+". 在vb2005中运算符大致可以分为5种类型:算术运算符.位运算符. 关系运算符.赋值运算符.逻辑运算符. 算数运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 求余 注意: ++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符. func main() { a, b := 3,4 fmt.Printf("a 加 b

  • golang指数运算操作

    我就废话不多说了,大家还是直接看代码吧~ func main() { fmt.Println(exponent (5,3)) } //a的n次方 //超出uint64的部分会丢失 func exponent (a,n uint64) uint64 { result := uint64(1) for i := n ; i > 0; i >>= 1 { if i&1 != 0 { result *= a } a *= a } return result } 补充:Golang 位运算

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

    牛顿法求平方根 原理 计算机常用循环来计算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 f

  • C语言简单实现求n阶勒让德多项式的方法

    本文实例讲述了C语言简单实现求n阶勒让德多项式的方法.分享给大家供大家参考,具体如下: #include <stdio.h> float p(float x,int n) { float p_n; if(0==n) {p_n=1;} else if(1==n) { p_n=x; } else { p_n=((2*n-1)*x-p(x,n-1)-(n-1)*p(x,n-2))/n; } return p_n; } main() { int n; printf("input n :&qu

  • 使用Python实现牛顿法求极值

    对于一个多元函数 用牛顿法求其极小值的迭代格式为 其中 为函数 的梯度向量, 为函数 的Hesse(Hessian)矩阵. 上述牛顿法不是全局收敛的.为此可以引入阻尼牛顿法(又称带步长的牛顿法). 我们知道,求极值的一般迭代格式为 其中 为搜索步长, 为搜索方向(注意所有的迭代格式都是先计算搜索方向,再计算搜索步长,如同瞎子下山一样,先找到哪个方向可行下降,再决定下几步). 取下降方向 即得阻尼牛顿法,只不过搜索步长 不确定,需要用线性搜索技术确定一个较优的值,比如精确线性搜索或者Goldste

  • 详解C语言读取文件求某一列的平均值

    目录 第一部分:比较读取文件的效率 第二部分:比较求取列平均值的效率 第一部分:比较读取文件的效率 在之前的文章<生信(五)awk求取某一列的平均值>中,笔者曾经给出过C语言求取某列平均值的代码,但是最近回顾时发现,这段代码至少有几点不足: 1. 利用 fgetc 函数来读取文件,现在看来效率不高. 2. 如果文件最后没有一个空白行的话,会陷入无限循环.也就是对 EOF 的处理不完善. 大家都知道,C语言读取文件的常用函数有 fgetc.fgets.fread 以及 fscanf 等.笔者曾经

  • python 已知三条边求三角形的角度案例

    我就废话不多说了,还是直接看代码吧! import math a=1;//边1 b=1;//边2 c=math.sqrt(2);//边3 A=math.degrees(math.acos((a*a-b*b-c*c)/(-2*b*c)))//夹角1 B=math.degrees(math.acos((b*b-a*a-c*c)/(-2*a*c)))//夹角2 C=math.degrees(math.acos((c*c-a*a-b*b)/(-2*a*b)))//夹角3 print(A) print(B

  • 详解用Go语言实现工厂模式(Golang经典编程案例)

    golang中的struct没有构造函数,一般可以使用工厂模式来解决这个问题.这个模式本身很简单而且使用在业务较简单的情况下.一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改). 代码结构如下:分别有main.go和student.go两个文件. 在student.go中: package model //定义一个结构体 type student struct{ Name string score float64 } //因为student结构体首字母是小写,因此是只能在mod

  • C语言之函数返回值与参数传递案例教程

    C语言函数返回值与参数传递 一:参数传递 C语言的函数中必不可少的就是参数传递,可以采用传值和传指针两种方式. 1.传值的形式:只是将参数值的拷贝传给函数,并非参数本体如: int test(int x,int y) { x=2*y; return x; } int main(void) { int a=0,b=5; printf("%d,%d\n\r",test(a,b),a); return 0; } 运行结果为: 10,0 即传值方式只可以将实参传递给函数,不可以改变实参本身.

  • C语言深入探究冒泡排序与堆排序使用案例讲解

    目录 一.冒泡排序 1.1冒泡排序引入 1.2冒泡排序的核心思想与算法分析 1.3实例说明 1.4优化 1.5代码实现 1.6性能分析 二.堆排序 2.1堆的基础知识 2.1.1堆是什么 2.1.2堆的性质 2.2堆排序的核心思想与基本步骤 2.3实例说明与分析 2.4代码实现 2.5性能分析 一.冒泡排序 1.1冒泡排序引入 对于任何编程语言,当我们学到循环和数组的时候,都会介绍一种排序算法:冒泡排序:深入学习更多排序算法后和在实际使用情况中,冒泡排序的使用还是极少的.它适合数据规模很小的时候

  • 汇编程序 查表求平方的实现

    [任务]设在内存单元SQTAB首址开始存放了0-15的平方数表.要求用直接查表法编一程序,求出A单元中给定数(<=15)的平方值送B单元保存. [参考解答1] assume cs: code, ds: data data segment sqtab db 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 db 100, 121, 144, 169, 196, 225 a db 12 b db ? data ends code segment start: mov ax, da

  • C语言实现黎曼和求定积分

    本文实例为大家分享了C语言程序实现黎曼和求定积分,供大家参考,具体内容如下 通过黎曼和解定积分既是把在xy平面中函数曲线与x轴区间区域划分成多个矩形并求它们的面积之和,矩形数量越多,得出的面积越精确. #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int main(){ float function1(float); //函数f(x)1 float f

随机推荐