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 相关文章推荐
Windows下搭建python开发环境详细步骤
Jul 20 Python
python八大排序算法速度实例对比
Dec 06 Python
python kmeans聚类简单介绍和实现代码
Feb 23 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
Oct 18 Python
使用python+whoosh实现全文检索
Dec 09 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
Dec 17 Python
如何解决tensorflow恢复模型的特定值时出错
Feb 06 Python
Python3爬虫mitmproxy的安装步骤
Jul 29 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
python 装饰器的实际作用有哪些
Sep 07 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
python中的None与NULL用法说明
May 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 session_start()关于Cannot send session cache limiter - headers already sent错误解决方法
2009/11/27 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
2011/11/10 PHP
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
PHP CURL获取cookies模拟登录的方法
2013/11/04 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
js实现在同一窗口浏览图片
2014/09/17 Javascript
kindeditor修复会替换script内容的问题
2015/04/03 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
关于验证码在IE中不刷新的快速解决方法
2016/09/23 Javascript
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
vue开发简单上传图片功能
2020/06/30 Javascript
Openlayers+EasyUI Tree动态实现图层控制
2020/09/28 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python基于whois模块简单识别网站域名及所有者的方法
2018/04/23 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
英国折扣零售连锁店:QD Stores
2018/12/08 全球购物
个人实用简单的自我评价
2013/10/19 职场文书
高中校园广播稿
2014/01/11 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
酒店节能降耗方案
2014/05/08 职场文书
个人综合鉴定材料
2014/05/23 职场文书
民主生活会发言材料
2014/10/20 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
Python Parser的用法
2021/05/12 Python
Python编程中Python与GIL互斥锁关系作用分析
2021/09/15 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript