【问题标题】:Pi calculation in python [closed]python中的Pi计算[关闭]
【发布时间】:2013-11-02 05:28:16
【问题描述】:

n=迭代次数

由于某种原因,这段代码需要更多的迭代才能从其他代码中得到更准确的结果,谁能解释为什么会发生这种情况?谢谢。

    n,s,x=1000,1,0
    for i in range(0,n,2):
            x+=s*(1/(1+i))*4
            s=-s
    print(x)

【问题讨论】:

    标签: python python-3.x iteration pi


    【解决方案1】:

    正如我在评论中提到的,加快此速度的唯一方法是转换序列。这是与欧拉变换相关的一种非常简单的方法(请参阅roippi's link):对于交替序列的总和,创建一个由每对连续部分和的平均值 组成的新序列。例如,给定交替序列

    a0 -a1 +a2 -a3 +a4 ...
    

    如果所有as 都是正数,则部分和的序列是:

    s0=a0  s1=a0-a1  s2=a0-a1+a2  s3=a0-a1+a2-a3  s4=a0-a1+a2-a3+a4 ...
    

    然后新的派生序列是:

    (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 个术语之后,我们已经将 pi 提高到大约 6 个有效数字。基本莱布尼茨序列仍然大约正确 2 位数:

    >>> next(base)
    3.099944032373808
    

    这是一个巨大的进步。这里的一个关键点是基本莱布尼茨序列的部分和给出了在“太大”和“太小”之间交替的近似值。这就是为什么平均它们更接近真相。派生的序列也是如此(在“太大”和“太小”之间交替),因此平均它们的项也有帮助。

    当然,这一切都是徒劳的。严格的理由可能不是你感兴趣的东西;-)

    【讨论】:

    【解决方案2】:

    那是因为您使用的是Leibniz series,并且已知它会非常(非常)缓慢地收敛。

    【讨论】:

    • 我知道这是莱布尼茨公式,问题是这段代码是否可以通过不同的方式编写以在更少的迭代中获得更高的准确性? (使用莱布尼茨)
    • @BlacklightShining 这是对上述问题的直接答案:for some reason this code will need a lot more iterations for more accurate result from other codes, Can anyone explain why this is happening?
    • 啊!错误的帖子。哎呀。
    • @MikeL 我对此表示怀疑。如果您使用完全相同的数学算法,那么对于给定的迭代次数,您将获得完全相同的精度。
    • @MikeL,点击 roippi 给你的链接。阅读“效率低下”部分。它简要介绍了几种可用于加速收敛的转换。莱布尼茨级数的原样效率非常低,并且仅重新安排它所做的计算的任何方法都不会有任何帮助。
    猜你喜欢
    • 2015-12-16
    • 2011-05-07
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多