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下载FTP上的文件夹的实现代码
Feb 10 Python
一个简单的python程序实例(通讯录)
Nov 29 Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
Python实现线程池代码分享
Jun 21 Python
python 通过logging写入日志到文件和控制台的实例
Apr 28 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
浅析python,PyCharm,Anaconda三者之间的关系
Nov 27 Python
python 解决tqdm模块不能单行显示的问题
Feb 19 Python
PyCharm中Matplotlib绘图不能显示UI效果的问题解决
Mar 12 Python
Python 实现网课实时监控自动签到、打卡功能
Mar 12 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 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
中英文字符串翻转函数
2008/12/09 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
Laravel 关联模型-关联新增和关联更新的方法
2019/10/10 PHP
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
利用js给datalist或select动态添加option选项的方法
2018/01/25 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
用原生JS实现爱奇艺首页导航栏代码实例
2019/09/19 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
Vue可自定义tab组件用法实例
2019/10/24 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
vue项目中播放rtmp视频文件流的方法
2020/09/17 Javascript
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
python版DDOS攻击脚本
2019/06/12 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
python实现倒计时小工具
2019/07/29 Python
Python获取时间戳代码实例
2019/09/24 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
keras 读取多标签图像数据方式
2020/06/12 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
HTML5实现预览本地图片
2016/02/17 HTML / CSS
移动端HTML5实现文件上传功能【附代码】
2016/03/25 HTML / CSS
酒店管理毕业生自荐信
2013/10/24 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
小学生综合素质评语
2014/04/23 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
批评与自我批评总结
2014/10/17 职场文书
博士导师推荐信
2015/03/25 职场文书
家属联谊会致辞
2015/07/31 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
Redis的字符串是如何实现的
2021/10/24 Redis
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏