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基于socket实现网络广播的方法
Apr 29 Python
python+django加载静态网页模板解析
Dec 12 Python
详解Python异常处理中的Finally else的功能
Dec 29 Python
python实现定时自动备份文件到其他主机的实例代码
Feb 23 Python
python实现二维插值的三维显示
Dec 17 Python
解决python xx.py文件点击完之后一闪而过的问题
Jun 24 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
python fuzzywuzzy模块模糊字符串匹配详细用法
Aug 29 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Python绘制动态水球图过程详解
Jun 03 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 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
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
ThinkPHP通过AJAX返回JSON的两种实现方法
2014/12/18 PHP
php 使用array函数实现分页
2015/02/13 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
PHP实现留言板功能的详细代码
2017/03/25 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
Nigma vs Alliance BO5 第三场2.14
2021/03/10 DOTA
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
Js获取图片原始宽高的实现代码
2016/05/17 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
ES6小技巧之代替lodash
2019/06/07 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[00:36]我的中国心——Serenity vs Fnatic
2018/08/21 DOTA
Python脚本实现集群检测和管理功能
2015/03/06 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
python如何修改装饰器中参数
2018/03/20 Python
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
实习销售业务员自我鉴定
2013/09/21 职场文书
前台接待员岗位职责
2014/01/02 职场文书
团组织关系介绍信
2014/01/12 职场文书
市场专员岗位职责
2014/02/14 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
励志演讲稿200字
2014/08/21 职场文书
介绍信格式
2015/01/30 职场文书
2015大学生自我评价范文
2015/03/03 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
go语言map与string的相互转换的实现
2021/04/07 Golang
openstack云计算keystone组件工作介绍
2022/04/20 Servers
sql查询语句之平均分、最高最低分及排序语句
2022/05/30 MySQL