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中管道用法入门实例
Jun 04 Python
Python访问纯真IP数据库脚本分享
Jun 29 Python
python 链接和操作 memcache方法
Mar 04 Python
浅谈机器学习需要的了解的十大算法
Dec 15 Python
Python中的并发处理之asyncio包使用的详解
Apr 03 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
python中 * 的用法详解
Jul 10 Python
Tensorflow累加的实现案例
Feb 05 Python
python实现画图工具
Aug 27 Python
python实现感知机模型的示例
Sep 30 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Python网络编程之ZeroMQ知识总结
Apr 25 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
php设计模式 Adapter(适配器模式)
2011/06/26 PHP
遍历指定目录下的所有目录和文件的php代码
2011/11/27 PHP
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
高质量PHP代码的50个实用技巧必备(上)
2016/01/22 PHP
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
计算新浪Weibo消息长度(还可以输入119字)
2013/07/02 Javascript
javascript实现促销倒计时+fixed固定在底部
2013/09/18 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
javascript清空table表格的方法
2015/05/14 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
jquery中ready()函数执行的时机和window的load事件比较
2015/06/22 Javascript
JavaScript和HTML DOM的区别与联系及Javascript和DOM的关系
2015/11/15 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
BootStrap Table后台分页时前台删除最后一页所有数据refresh刷新后无数据问题
2016/12/28 Javascript
详解Angular中的自定义服务Service、Provider以及Factory
2017/04/22 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
Vue2.0系列之过滤器的使用
2018/03/01 Javascript
vscode配置vue下的es6规范自动格式化详解
2019/03/20 Javascript
小程序server请求微信服务器超时的解决方法
2019/05/21 Javascript
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
Python里隐藏的“禅”
2014/06/16 Python
Python中random模块生成随机数详解
2016/03/10 Python
pyqt 实现为长内容添加滑轮 scrollArea
2019/06/19 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
如何利用Python模拟GitHub登录详解
2019/07/15 Python
PyTorch中的Variable变量详解
2020/01/07 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
详解python with 上下文管理器
2020/09/02 Python
Emma Bridgewater官网:英国餐具制造商
2019/11/24 全球购物
计算机求职信
2014/07/02 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
JavaScript canvas实现流星特效
2021/05/20 Javascript