求一个数的平方根函数sqrt(int num) ,在大多数语言中都提供实现。那么要求一个数的平方根,是怎么实现的呢?

实际上求平方根的算法方法主要有两种:二分法(binary search)和牛顿迭代法(Newton iteration)

1:二分法

求根号5

a:折半:       5/2=2.5

b:平方校验:  2.5*2.5=6.25>5,并且得到当前上限2.5

c:再次向下折半:2.5/2=1.25

d:平方校验:1.25*1.25=1.5625<5,得到当前下限1.25

e:再次折半:2.5-(2.5-1.25)/2=1.875

f:平方校验:1.875*1.875=3.515625<5,得到当前下限1.875

每次得到当前值和5进行比较,并且记下下下限和上限,依次迭代,逐渐逼近平方根:

import math
from math import sqrtdef sqrt_binary(num):x=sqrt(num)y=num/2.0low=0.0up=num*1.0count=1while abs(y-x)>0.00000001:print count,ycount+=1     if (y*y>num):up=yy=low+(y-low)/2else:low=yy=up-(up-y)/2return yprint(sqrt_binary(5))
print(sqrt(5))

运行结果:

1 2.5
2 1.25
3 1.875
4 2.1875
5 2.34375
6 2.265625
7 2.2265625
8 2.24609375
9 2.236328125
10 2.2314453125
11 2.23388671875
12 2.23510742188
13 2.23571777344
14 2.23602294922
15 2.23617553711
16 2.23609924316
17 2.23606109619
18 2.23608016968
19 2.23607063293
20 2.23606586456
21 2.23606824875
22 2.23606705666
23 2.2360676527
24 2.23606795073
25 2.23606809974
26 2.23606802523
27 2.23606798798
2.23606796935
2.2360679775
[Finished in 0.1s]

经过27次二分法迭代,得到的值和系统sqrt()差别在0.00000001,精度在亿分之一,

0.001需要迭代8次

因此,在对精度要求不高的情况下,二分法也算比较高效的算法。

2:牛顿迭代

仔细思考一下就能发现,我们需要解决的问题可以简单化理解。
从函数意义上理解:我们是要求函数f(x) = x²,使f(x) = num的近似解,即x² - num = 0的 近似解
从几何意义上理解:我们是要求抛物线g(x) = x² - num与x轴交点(g(x) = 0)最接近的点。
我们假设g(x0)=0,即x0是正解,那么我们要做的就是让近似解x不断逼近x0,这是函数导数的定义:
可以由此得到
从几何图形上看,因为导数是切线,通过不断迭代,导数与x轴的交点会不断逼近x0。

对于一般情况:

将m=2代入:

def sqrt_newton(num):x=sqrt(num)y=num/2.0count=1while abs(y-x)>0.00000001:print count,ycount+=1y=((y*1.0)+(1.0*num)/y)/2.0000return yprint(sqrt_newton(5))
print(sqrt(5))

运行结果:

1 2.5
2 2.25
3 2.23611111111
2.23606797792
2.2360679775

精确到亿分之一,牛顿法只迭代了3次,是二分法的十倍

3:利用牛顿法求开立方

def cube_newton(num):x=num/3.0y=0count=1while abs(x-y)>0.00000001:print count,xcount+=1y=xx=(2.0/3.0)*x+(num*1.0)/(x*x*3.0)return xprint(cube_newton(27)) 

微积分、概率、线代是高级算法的基础课。可是,这么多年,已经忘得差不多了..............................

二分法和牛顿迭代法求平方根(Python实现)相关推荐

  1. python用牛顿迭代法求平方根_Python编程实现二分法和牛顿迭代法求平方根代码

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. Python:牛顿迭代法求平方根

    #69573 牛顿迭代法求平方根[光]-函数复用#69573 牛顿迭代法求平方根描述牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson meth ...

  3. 【算法】牛顿迭代法求平方根的原理和误差分析

    前言 在<算法(第四版)>中的P23页,给出了经典的利用牛顿迭代法求平方根的算法,牛顿迭代法在数值计算中应用十分广泛,但是在看书中的代码时,我最困惑的是其中对收敛条件的判断,经过查阅资料和 ...

  4. 分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根

    编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代区间 ...

  5. 题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)

    题目:任意给定一个浮点数,计算这个浮点数的立方根.(基于二分法和牛顿迭代法)(基于Java实现) 首先,来分析一下这道题,其实在leetcode上做了求解根号3的题之后,对于这种求解立方根的题,基本上 ...

  6. 141. Sqrt(x)【牛顿迭代法求平方根 by java】

    Description Implement int sqrt(int x). Compute and return the square root of x. Example sqrt(3) = 1 ...

  7. 经典算法:牛顿迭代法求平方根

    //牛顿迭代法求平方根 1 double mysqrt(double num) 2 { 3 double x = num/2; 4 double y = 0; 5 do{ 6 x = x/2+num/ ...

  8. 牛顿迭代法求平方根原理

    牛顿迭代法可以求解n次方的根,但这里只讨论用它来求平方根. 牛顿迭代法求平方根过程 Java代码实现 /*** 求一个数的平方根* @param number* @return*/public sta ...

  9. 牛顿迭代法求平方根倒数

    牛顿迭代法,第二次看了,发现几乎又是从头开始搜集资料,不如整理记录一下,也和大家分享一下: 牛顿迭代法的核心思想是:切线是曲线的线性逼近,通过迭代求切线最后找到函数近似解的过程.具体可以参考下面这个文 ...

最新文章

  1. Mysql主从同步延迟问题及解决方案
  2. 解决QT无法调试问题-----the cdb process terminated
  3. 【Java Web开发指南】深入浅出Spring和SpringMVC
  4. torch的拼接函数_从零开始深度学习Pytorch笔记(13)—— torch.optim
  5. 如何处理postman Self-signed SSL certificate blocked错误
  6. 关于IE的RegExp.exec
  7. 深度学习推荐模型-WideDeep
  8. java程序设计比赛心得体会_对Java程序设计的感想.doc
  9. c语言与西门子plc通讯,西门子PLC四种核心通讯方式汇总学习
  10. linux chm 阅读器,linux下最好的chm阅读器KchmViewer,安装使用/与oklular,xCHM,gnochm简单比较...
  11. 大数据工具千千万,到底谁才是最强王者?
  12. C++--问题35--min和max函数和minmax函数的用法
  13. 线程的启动暂停和终止
  14. 谷歌日志glog库的使用
  15. Python编程学习之基础数据类型
  16. Java中某日期时间加减5分钟、10分钟的方法
  17. CICD详解(十四)——Gitlab忘记密码恢复
  18. 陈天桥三口之家幸福插曲
  19. ProtoBuf 生成 Go 代码去掉 JSON tag omitempty
  20. 怎么办理软件产品登记测试报告,软件产品登记有什么作用?

热门文章

  1. data:image图片转png与jpg,png转data:image格式。
  2. java获取两个时间之间的所有日期、月份、年份,返回列表
  3. 【java获取日期的年月日】
  4. 目前有哪些比较好的App流量变现的方法?
  5. 互联网红利之道-流量变现
  6. 知识图谱嵌入的Translate模型汇总(TransE,TransH,TransR,TransD
  7. 关于如何将代码上传到gitee仓库的详细步骤
  8. 关于python如何编写注释(包含中文)及出现SyntaxError: Non-UTF-8 code starting with ‘\xca‘ in file错误解决方案
  9. IC设计中节省静态功耗和动态功耗的方法
  10. 如何从零搭建自动化测试框架