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的string模块中的Template类字符串模板用法
Jun 27 Python
Python下实现的RSA加密/解密及签名/验证功能示例
Jul 17 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
Python使用numpy实现BP神经网络
Mar 10 Python
Python 字符串转换为整形和浮点类型的方法
Jul 17 Python
python中while和for的区别总结
Jun 28 Python
浅析python 中大括号中括号小括号的区分
Jul 29 Python
Python 项目转化为so文件实例
Dec 23 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
python实现扑克牌交互式界面发牌程序
Apr 22 Python
Python字典取键、值对的方法步骤
Sep 30 Python
Pytorch 中net.train 和 net.eval的使用说明
May 22 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
SONY SRF-M100的电路分析
2021/03/02 无线电
discuz的php防止sql注入函数
2011/01/17 PHP
php获取远程文件大小
2015/10/20 PHP
PHP使用POP3读取邮箱接收邮件的示例代码
2020/07/08 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
微信小程序 action-sheet 反馈上拉菜单简单实例
2017/05/11 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
jQuery图片加载失败替换默认图片方法汇总
2017/11/29 jQuery
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
[46:44]VG vs TNC Supermajor小组赛B组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
python简单实现操作Mysql数据库
2018/01/29 Python
利用Python如何批量更新服务器文件
2018/07/29 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
python实现逻辑回归的示例
2020/10/09 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
HTML5标签小集
2011/08/02 HTML / CSS
西部世纪.net笔试题面试题
2014/04/03 面试题
我们没有写servlet的构造方法,那么容器是怎么创建servlet的实例呢
2013/04/24 面试题
大学毕业生自荐书怎么写?
2014/01/06 职场文书
打架检讨书400字
2014/01/17 职场文书
上班离岗检讨书
2014/01/27 职场文书
房地产项目策划书
2014/02/05 职场文书
优秀家长事迹材料
2014/05/17 职场文书
行政执法作风整顿剖析材料
2014/10/11 职场文书
个人作风建设总结
2014/10/23 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
汽车转让协议书
2015/01/29 职场文书
教师党员个人自我评价
2015/03/04 职场文书
2019升学宴主持词范本5篇
2019/10/09 职场文书
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript