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类型强制转换long to int的代码
Feb 10 Python
ptyhon实现sitemap生成示例
Mar 30 Python
Python随手笔记第一篇(2)之初识列表和元组
Jan 23 Python
用Python逐行分析文件方法
Jan 28 Python
python分数表示方式和写法
Jun 26 Python
pyinstaller参数介绍以及总结详解
Jul 12 Python
对python中的装包与解包实例详解
Aug 24 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
Python定时器线程池原理详解
Feb 26 Python
Jupyter notebook如何实现指定浏览器打开
May 13 Python
详解Python中的Lock和Rlock
Jan 26 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
phpcms模块开发之swfupload的使用介绍
2013/04/28 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
document.addEventListener使用介绍
2014/03/07 Javascript
JavaScript运行时库属性一览表
2014/03/14 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
使用jQuery实现动态添加小广告
2017/07/11 jQuery
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
Python使用PIL库实现验证码图片的方法
2016/03/11 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
pygame游戏之旅 添加游戏界面按键图形
2018/11/20 Python
Python切图九宫格的实现方法
2019/10/10 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
最新销售员个人自荐信
2013/09/21 职场文书
教师个人剖析材料
2014/02/05 职场文书
2014全国两会学习心得体会1000字
2014/03/10 职场文书
党建工作先进材料
2014/05/02 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
python如何获取网络数据
2021/04/11 Python
python实现三阶魔方还原的示例代码
2021/04/28 Python
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python