二分法和牛顿迭代法求平方根(Python实现)
来源:互联网 发布:淘宝企业店铺如何更换 编辑:程序博客网 时间:2024/04/30 09:16
求一个数的平方根函数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 mathfrom math import sqrtdef sqrt_binary(num):x=sqrt(num)y=num/2.0low=0.0up=num*1.0count=1while abs(y-x)>0.00000001:print count,ycount+=1if (y*y>num):up=yy=low+(y-low)/2else:low=yy=up-(up-y)/2return yprint(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:牛顿迭代
对于一般情况:
将m=2代入:
def sqrt_newton(num):x=sqrt(num)y=num/2.0count=1while abs(y-x)>0.00000001:print count,ycount+=1y=((y*1.0)+(1.0*num)/y)/2.0000return yprint(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.0y=0count=1while abs(x-y)>0.00000001:print count,xcount+=1y=xx=(2.0/3.0)*x+(num*1.0)/(x*x*3.0)return xprint(cube_newton(27))
微积分、概率、线代是高级算法的基础课。可是,这么多年,已经忘得差不多了..............................
- 二分法和牛顿迭代法求平方根(Python实现)
- 二分法和牛顿迭代法求平方根(Python实现)
- [C]关于用二分法和牛顿迭代法求平方根
- 【算法王道】二分法和牛顿迭代法求平方根
- 求平方根的方法(牛顿迭代法和二分法)
- 习题- 二分法/牛顿迭代法 求算术平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 牛顿迭代法求平方根
- 二分法和牛顿法求平方根
- 利用牛顿迭代法求平方根
- 利用牛顿迭代法求平方根
- android新版本中如何解决厂商应用的su权限
- 找出有向图中的弱联通分量
- Linux基础指令大全
- Eclipse快捷键
- linux下的C语言开发(线程等待)
- 二分法和牛顿迭代法求平方根(Python实现)
- Android部分厂商手机无法连接Mac系统进行调试的解决方法
- 简介
- #if _MSC_VER > 1000 #pragma once #endif 作用解释
- 加载DLL
- Base64编码与解码(转)
- mp4 查找sample偏移
- shell 快捷键汇总
- 对TeXworks编辑器再感受