求一个数的平方根函数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 sqrt

def sqrt_binary(num):

x=sqrt(num)

y=num/2.0

low=0.0

up=num*1.0

count=1

while abs(y-x)>0.00000001:

print count,y

count+=1

if (y*y>num):

up=y

y=low+(y-low)/2

else:

low=y

y=up-(up-y)/2

return y

print(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.0

count=1

while abs(y-x)>0.00000001:

print count,y

count+=1

y=((y*1.0)+(1.0*num)/y)/2.0000

return y

print(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.0

y=0

count=1

while abs(x-y)>0.00000001:

print count,x

count+=1

y=x

x=(2.0/3.0)*x+(num*1.0)/(x*x*3.0)

return x

print(cube_newton(27))

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

python牛顿迭代法求平方根_Python编程如何实现二分法及牛顿迭代法求平方根代码...相关推荐

  1. python解包操作_Python编程使用*解包和itertools.product()求笛卡尔积的方法

    本文实例讲述了Python编程使用*解包和itertools.product()求笛卡尔积的方法.分享给大家供大家参考,具体如下: [问题] 目前有一字符串s = "['a', 'b'],[ ...

  2. python新建文件夹口令_python编程快速上手—口令保管箱

    之前小编为大家整理了如何成为一个优秀的程序员应该具备的品质,接下来为大家展示一个简单有趣的python小项目,从中体会编程的乐趣.小编了解这个小项目之后,很是惊奇,觉得python竟然还可以做这样的事 ...

  3. python好学么零基础_python编程好学吗 自学行吗

    很多人都说python简单好学,对于有编程经验和一定基础的人来说,学python并不难.但如果是零基础人员,学起来还是有一定难度的.Python相对于其他编程语言来说比较容易,入门简单,对零基础人员比 ...

  4. 可用作python变量名的是_Python编程4:什么是变量

    #少儿编程# 我们在上一篇<Python编程3:与计算机对话之键盘输入input()>中介绍input()函数时曾经使用过变量,将键盘输入的内容赋给变量name.变量,在各个编程语言中都是 ...

  5. matlab牛顿法求区间根程序,MATLAB用二分法、不动点迭代法及Newton迭代(切线)法求非线性方程的根...

    一.实验原理 二.实验步骤 三.实验过程 1.(程序) (1)二分法:求  在区间(1,2)之间的根,取 (a)bipart.m: function [x,m]=bipart(fun,a0,b0,to ...

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

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

  7. python解一元二次方程虚根_Python编程实现数学运算求一元二次方程的实根算法示例...

    本文实例讲述了Python编程实现数学运算求一元二次方程的实根算法.分享给大家供大家参考,具体如下: 问题: 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程:ax² ...

  8. python编程求平均值_Python编程求平均值的两种方法是?

    方法一: scores = [91, 95, 97, 99, 92, 93, 96, 98] scores2 = [] avg = sum(scores) / len(scores) print('平 ...

  9. python 分离整数与小数_Python编程:离不开算术运算符的顺序结构

    今天讲解的是第二篇<离不开算术运算符的顺序结构>.本节主要针对几个不易理解的算术运算符进行介绍,并在了解顺序结构的基础上,学习信息技术学考中顺序结构编程.知识点学习共包括四关. 你准备好了 ...

  10. python写错了怎么撤回_Python编程常见问题与解答

    1.问:Python代码运行速度和C语言相比,哪个更快? 答:一般来说,Python代码的运行速度比C语言的慢很多,但是如果充分运用内置函数.标准库对象和函数式编程模式的话,运行速度会提高很多,可以接 ...

最新文章

  1. 强强联合!Papers with Code 携手 arXiv,上传论文、提交代码一步到位
  2. 莱特准则 matlab,初学MATLAB,遇到一简单的题目,一点头绪也没有啊.99
  3. 罗辑思维:情怀还是生意?
  4. 【数据结构】线性表的链式存储-双链表
  5. Kafka解惑之Old Producer(1)—— Beginning
  6. mysql 5.5.41 下载_MySQL 5.5.41/5.6.22 发布下载
  7. linux清理整个磁盘空间,一次Linux磁盘空间清理的经历
  8. 【Elasticsearch】Elasticsearch 7.4的 soft-deletes 是个什么鬼
  9. hdu 1251 统计难题 (字典树入门题)
  10. matlab相机标定_综述 | 相机标定方法
  11. 遗传算法c语言代码实验报告,遗传算法的c语言程序
  12. Android组件化开发,组件间的Activity页面跳转。
  13. 半导体器件相关专业词汇积累ing
  14. 【春招】能不能好好写简历,这样真的不敢给你内推进来跟我做同事
  15. 还是firefox 连接https 报错:(连接被重置)(已解决)
  16. VUEcli3设置页签图标
  17. 谷歌浏览器(chrome)允许跨域/允许https网站中发送http请求
  18. 云栖回顾|龙蜥社区有哪些值得回味的精彩瞬间?
  19. 2017 八大黑客攻击事件,这一年网络安全的世界血雨腥风
  20. java smb协议 smbj和jcifs比较

热门文章

  1. 8.621 - Secret Research
  2. MatlabTrick
  3. Android对话框总结(普通对话框,单选对话框,多选对话框,自定义对话框)
  4. vscode还用装git_使用vscode实现git同步
  5. python word转pdf图片格式_Python将word转换为PDF格式文件(包括批处理转换),Word,Pdf,包含,批量...
  6. php++l+函数,关于PHP中usort()函数的解读
  7. win10自带sftp服务器_用于Windows系统的免费SFTP服务器-Free SFTP Servers及各款软件功能对比...
  8. Android Studio 3.3发布:官方支持导航编辑器
  9. RestTemplate 配置http连接池
  10. Linux 异步IO