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函数中的函数(闭包)用法实例
Mar 15 Python
从零开始学Python第八周:详解网络编程基础(socket)
Dec 14 Python
python生成二维码的实例详解
Oct 29 Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 Python
Python实现简单的用户交互方法详解
Sep 25 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
python中正则表达式与模式匹配
May 07 Python
Python使用Pandas读写Excel实例解析
Nov 19 Python
Python中join()函数多种操作代码实例
Jan 13 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
在Sublime Editor中配置Python环境的详细教程
May 03 Python
如何基于python把文字图片写入word文档
Jul 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
PHP 中的一些经验积累
2006/10/09 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
js类 from qq
2006/11/13 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
微信小程序 教程之WXSS
2016/10/18 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
Node.js上传文件功能之服务端如何获取文件上传进度
2018/02/05 Javascript
JS获取指定月份的天数两种实现方法
2018/06/22 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
浅谈Vue render函数在ElementUi中的应用
2018/09/06 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Python入门_浅谈字符串的分片与索引、字符串的方法
2017/05/16 Python
python中正则表达式的使用方法
2018/02/25 Python
Python检测网络延迟的代码
2018/05/15 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Scrapy框架使用的基本知识
2018/10/21 Python
对python实现合并两个排序链表的方法详解
2019/01/23 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
Django ForeignKey与数据库的FOREIGN KEY约束详解
2020/05/20 Python
python安装sklearn模块的方法详解
2020/11/28 Python
计算机个人求职信范例
2014/01/24 职场文书
财产公证书样本
2014/04/04 职场文书
万能检讨书2000字
2014/10/17 职场文书
聘任证明怎么写
2015/03/02 职场文书
年度考核表个人总结
2015/03/06 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
《秋思》教学反思
2016/02/23 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python