Python编程实现二分法和牛顿迭代法求平方根代码

 更新时间:2017年12月04日 14:12:15   作者:ycf74514  
这篇文章主要介绍了Python编程实现二分法和牛顿迭代法求平方根代码,具有一定参考价值,需要的朋友可以了解下。

求一个数的平方根函数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,这是函数导数的定义:

可以由此得到

从几何图形上看,因为导数是切线,通过不断迭代,导数与x轴的交点会不断逼近x0。

对于一般情况:

将m=2代入:

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编程实现二分法和牛顿迭代法求平方根代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。

相关文章

  • django queryset 去重 .distinct()说明

    django queryset 去重 .distinct()说明

    这篇文章主要介绍了django queryset 去重 .distinct()说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python实现二次元图片展示(屏保)

    python实现二次元图片展示(屏保)

    这篇文章主要介绍了python实现二次元图片展示,用了API端口相关的知识实现,下面详细的文章内容需要的小伙伴可以参考一下
    2022-02-02
  • 在类Unix系统上开始Python3编程入门

    在类Unix系统上开始Python3编程入门

    这篇文章主要介绍了在类Unix系统上开始Python3编程入门,讲解了最基础最直观的利用Print函数进行各种输出的方法,需要的朋友可以参考下
    2015-08-08
  • Python编程之string相关操作实例详解

    Python编程之string相关操作实例详解

    这篇文章主要介绍了Python编程之string相关操作,结合实例形式分析了Python字符串相关函数与常见操作技巧,需要的朋友可以参考下
    2017-07-07
  • 用vue.js组件模拟v-model指令实例方法

    用vue.js组件模拟v-model指令实例方法

    在本篇文章里小编给各位整理的是关于用vue.js组件模拟v-model指令实例方法和相关代码,需要的朋友们可以跟着学习下。
    2019-07-07
  • 在Python中进行CSV文件的读取与写入操作

    在Python中进行CSV文件的读取与写入操作

    本文详细介绍了如何在Python中使用csv模块进行CSV文件的读取和写入,包括基本用法和高级功能,如DictWriter和DictReader,以及注意事项,需要的朋友可以参考下
    2025-03-03
  • Python将Excel转换为多种图片格式的方法(PNG, JPG, BMP, SVG)

    Python将Excel转换为多种图片格式的方法(PNG, JPG, BMP, SVG)

    有时,你可能希望以图片形式分享Excel数据,以防止他人对数据进行修改或编辑,将Excel转换为图片可以将数据锁定为静态图片,确保数据的完整性和准确性,这篇文章将探讨如何使用Python实现将Excel工作表转换为多种图片格式,如PNG,JPG,BMP和SVG,需要的朋友可以参考下
    2025-03-03
  • python面向对象实现名片管理系统文件版

    python面向对象实现名片管理系统文件版

    这篇文章主要为大家详细介绍了python面向对象实现名片管理系统文件版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • django框架自定义模板标签(template tag)操作示例

    django框架自定义模板标签(template tag)操作示例

    这篇文章主要介绍了django框架自定义模板标签(template tag)操作,结合实例形式分析了Django框架自定义模板标签原理、操作步骤与相关实现技巧,需要的朋友可以参考下
    2019-06-06
  • Python利用matplotlib实现动态可视化详解

    Python利用matplotlib实现动态可视化详解

    Python中的数据可视化是指原始数据的图形表示,以更好地可视化、理解和推理,Python提供了各种库,包含用于可视化数据的不同特性,下面我们就来看看如何利用matplotlib实现动态可视化吧
    2023-08-08

最新评论