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 相关文章推荐
python3实现暴力穷举博客园密码
Jun 19 Python
基于python实现在excel中读取与生成随机数写入excel中
Jan 04 Python
python实现微信小程序自动回复
Sep 10 Python
python画图系列之个性化显示x轴区段文字的实例
Dec 13 Python
通过python爬虫赚钱的方法
Jan 29 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
Keras自定义IOU方式
Jun 10 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
python利用线程实现多任务
Sep 18 Python
Python pymysql模块安装并操作过程解析
Oct 13 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二维数组的去重问题解析
2011/07/17 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
基于php 随机数的深入理解
2013/06/05 PHP
php四种基础算法代码实例
2013/10/29 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
CI框架数据库查询之join用法分析
2016/05/18 PHP
laravel接管Dingo-api和默认的错误处理方式
2019/10/25 PHP
PHP强制转化的形式整理
2020/05/22 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JavaScript 学习历程和心得分享
2010/12/12 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
JavaScript数据结构和算法之二叉树详解
2015/02/11 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
vue+iview 兼容IE11浏览器的实现方法
2019/01/07 Javascript
Vue数字输入框组件的使用方法
2019/10/19 Javascript
[01:41]DOTA2超级联赛专访YYF 称一辈子难忘TI2
2013/05/28 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python实现弹跳小球
2019/05/13 Python
关于numpy数组轴的使用详解
2019/12/05 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
2020/05/20 Python
Python Selenium XPath根据文本内容查找元素的方法
2020/12/07 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
欢迎横幅标语
2014/06/17 职场文书
个人委托书如何写
2014/09/25 职场文书
财务检查整改报告
2014/11/06 职场文书
2014年法务工作总结
2014/12/11 职场文书
人民的好儿女观后感
2015/06/18 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
python神经网络Xception模型
2022/05/06 Python
Redis 限流器
2022/05/15 Redis