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中不同进制的语法及转换方法分析
Jul 27 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
Python实现感知机(PLA)算法
Dec 20 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
在Pandas中DataFrame数据合并,连接(concat,merge,join)的实例
Jan 29 Python
使用python获取邮箱邮件的设置方法
Sep 20 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
May 15 Python
Spring http服务远程调用实现过程解析
Jun 11 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
详解Python中的路径问题
Sep 02 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php中拷贝构造函数、赋值运算符重载
2012/07/25 PHP
PHP静态文件生成类实例
2014/11/29 PHP
php项目开发中用到的快速排序算法分析
2016/06/25 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
jQuery UI Dialog控件中的表单无法正常提交的解决方法
2010/12/19 Javascript
window.print打印指定div实例代码
2013/12/13 Javascript
jQuery中delegate和on的用法与区别详细解析
2014/01/26 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
JS HTML5拖拽上传图片预览
2016/07/18 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
javascript动画系列之模拟滚动条
2016/12/13 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
python zip文件 压缩
2008/12/24 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
Python numpy中矩阵的基本用法汇总
2019/02/12 Python
Python实现Appium端口检测与释放的实现
2020/12/31 Python
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
使用html2canvas实现将html内容写入到canvas中生成图片
2020/01/03 HTML / CSS
美国饼干礼物和美食甜点购买网站:Cheryl’s
2020/05/28 全球购物
杠杆的科学教学反思
2014/01/10 职场文书
心理健康教育制度
2014/01/27 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
考研经验交流会策划书
2015/11/02 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android
一篇文章带你掌握SQLite3基本用法
2022/06/14 数据库