Python编程实现二分法和牛顿迭代法求平方根代码


Posted in Python onDecember 04, 2017

求一个数的平方根函数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,这是函数导数的定义:

Python编程实现二分法和牛顿迭代法求平方根代码

可以由此得到

Python编程实现二分法和牛顿迭代法求平方根代码

从几何图形上看,因为导数是切线,通过不断迭代,导数与x轴的交点会不断逼近x0。

Python编程实现二分法和牛顿迭代法求平方根代码

对于一般情况:

Python编程实现二分法和牛顿迭代法求平方根代码

将m=2代入:

Python编程实现二分法和牛顿迭代法求平方根代码

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 相关文章推荐
python制作爬虫爬取京东商品评论教程
Dec 16 Python
python算法演练_One Rule 算法(详解)
May 17 Python
Django内容增加富文本功能的实例
Oct 17 Python
Python 类的特殊成员解析
Jun 20 Python
如何在Django中设置定时任务的方法示例
Jan 18 Python
Django restframework 源码分析之认证详解
Feb 22 Python
Python Numpy计算各类距离的方法
Jul 05 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
python dumps和loads区别详解
Feb 04 Python
用Python做一个久坐提醒小助手的示例代码
Feb 10 Python
Django设置Postgresql的操作
May 14 Python
解析python中的jsonpath 提取器
Jan 18 Python
Python编程给numpy矩阵添加一列方法示例
Dec 04 #Python
Python实现返回数组中第i小元素的方法示例
Dec 04 #Python
Python实现基本数据结构中队列的操作方法示例
Dec 04 #Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 #Python
Python内置函数—vars的具体使用方法
Dec 04 #Python
Python实现基本数据结构中栈的操作示例
Dec 04 #Python
Python实现多进程共享数据的方法分析
Dec 04 #Python
You might like
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
thinkphp如何获取客户端IP
2015/11/03 PHP
浅谈PHP各环境下的伪静态配置
2019/03/13 PHP
PHP时间类完整代码实例
2021/02/26 PHP
菜单效果
2006/10/14 Javascript
说说掌握JavaScript语言的思想前提想学习js的朋友可以看看
2009/04/01 Javascript
JavaScript中使用正则匹配多条,且获取每条中的分组数据
2010/11/30 Javascript
javascript复制粘贴与clipboardData的使用
2014/10/16 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
Bootstrap布局组件教程之Bootstrap下拉菜单
2016/06/12 Javascript
javascript如何创建对象
2016/08/29 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
2016/12/06 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
利用vue开发一个所谓的数独方法实例
2017/12/21 Javascript
vue.js中npm安装教程图解
2018/04/10 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
angular多语言配置详解
2019/05/16 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
PyCharm 2020 激活到 2100 年的教程
2020/03/25 Python
彻底解决Python包下载慢问题
2020/11/15 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Html5新标签解释及用法
2012/02/17 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
CSS实现fullpage.js全屏滚动效果的示例代码
2021/03/24 HTML / CSS
写好自荐信要注意的问题
2013/11/10 职场文书
乡镇交通安全实施方案
2014/03/29 职场文书
《微笑着面对生活》优秀演讲稿范文
2014/09/23 职场文书
Python中常见的反爬机制及其破解方法总结
2021/06/10 Python
win7配置本地ftp服务器的图文教程
2022/08/05 Servers