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中的字典详细介绍
Sep 18 Python
Python Requests安装与简单运用
Apr 07 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
详解Django+Uwsgi+Nginx的生产环境部署
Jun 25 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
Pytorch通过保存为ONNX模型转TensorRT5的实现
May 25 Python
使用Python将语音转换为文本的方法
Aug 10 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 Python
python 爬取吉首大学网站成绩单
Jun 02 Python
教你使用Python获取QQ音乐某个歌手的歌单
Apr 03 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模板引擎SMARTY
2006/10/09 PHP
Php部分常见问题总结
2006/10/09 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
ThinkPhP+Apache+PHPstorm整合框架流程图解
2020/11/23 PHP
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
2010/01/15 Javascript
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
Node实战之不同环境下配置文件使用教程
2018/01/02 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
2019/07/10 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
2020/02/06 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
简单的Python2.7编程初学经验总结
2015/04/01 Python
Python初学者常见错误详解
2019/07/02 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
Python类中self参数用法详解
2020/02/13 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
巴西在线鞋店:Shoestock
2017/10/28 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
How TDD works
2012/09/30 面试题
日语求职信范文
2013/12/17 职场文书
班主任工作经验材料
2014/02/02 职场文书
升职演讲稿范文
2014/05/23 职场文书
建筑学专业自荐书
2014/07/09 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
2014年党员自我评议(5篇)
2014/09/12 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
被告代理词范文
2015/05/25 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书