python里的pi_python中的Pi计算

正如我在一篇评论中提到的,加快速度的唯一方法就是转换序列。这里有一个与Euler变换相关的非常简单的方法(参见roippi's link):对于一个交替序列的和,创建一个新的序列,由每对连续部分和的平均值组成。例如,给定交替序列a0 -a1 +a2 -a3 +a4 ...

当所有a都为正时,部分和的序列为:

^{pr2}$

然后新的衍生序列是:(s0+s1)/2 (s1+s2)/2 (s2+s3)/2 (s3+s4)/2 ...

这通常可以更快地收敛,同样的想法也可以应用到这个序列中。也就是说,创建另一个新的序列,平均序列的项。这可以无限期地进行下去。在这里,我将更进一步:from math import pi

def leibniz():

from itertools import count

s, x = 1.0, 0.0

for i in count(1, 2):

x += 4.0*s/i

s = -s

yield x

def avg(seq):

a = next(seq)

while True:

b = next(seq)

yield (a + b) / 2.0

a = b

base = leibniz()

d1 = avg(base)

d2 = avg(d1)

d3 = avg(d2)

for i in range(20):

x = next(d3)

print("{:.6f} {:8.4%}".format(x, (x - pi)/pi))

输出:3.161905 0.6466%

3.136508 -0.1619%

3.143434 0.0586%

3.140770 -0.0262%

3.142014 0.0134%

3.141355 -0.0076%

3.141736 0.0046%

3.141501 -0.0029%

3.141654 0.0020%

3.141550 -0.0014%

3.141623 0.0010%

3.141570 -0.0007%

3.141610 0.0005%

3.141580 -0.0004%

3.141603 0.0003%

3.141585 -0.0003%

3.141599 0.0002%

3.141587 -0.0002%

3.141597 0.0001%

3.141589 -0.0001%

所以在仅仅20个术语之后,我们已经得到π到了6个有效数字。基本莱布尼兹序列仍在2位数左右正确:>>> next(base)

3.099944032373808

这是一个巨大的进步。这里的一个关键点是基Leibniz序列的部分和给出了介于“太大”和“太小”之间的近似值。这就是为什么平均他们更接近真相。同样的(在“太大”和“太小”之间交替出现)也适用于派生序列,因此平均它们的项也有帮助。在

当然,那都是波浪形的。严格的辩护可能不是你感兴趣的;-)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值