π的莱布尼兹公式-这有什么好的吗?(Python)

2024-06-02 06:14:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个练习,要求用莱布尼兹公式求一个近似π值的函数。以下是维基百科上的解释:

enter image description here

enter image description here

逻辑思维对我来说很容易,但我没有受过多少正规的数学教育,所以我有点迷失了,第二个符号中最左边的代表什么。我试图使代码pi = ( (-1)**n / (2*n + 1) ) * 4,但它返回的是1.9999990000005e-06,而不是3.14159…,所以我使用了累加器模式(因为指南中的这一章也提到了它们),它工作得很好。不过,我还是忍不住觉得这有点做作,而且考虑到Python关注的是简单性和尽可能缩短程序的长度,可能还有更好的方法。这是完整的代码:

def myPi(n):
    denominator = 1
    addto = 1

    for i in range(n):
        denominator = denominator + 2
        addto = addto - (1/denominator)
        denominator = denominator + 2
        addto = addto + (1/denominator)

    pi = addto * 4

    return(pi)

print(myPi(1000000))

有人知道更好的函数吗?


Tags: 方法函数代码程序指南模式pi符号
3条回答

这里的大写sigma是sigma notation。它是用简明扼要的形式表示总和的符号。

所以你的和实际上是一个无穷的和。n=0的第一项是:

(-1)**0/(2*0+1)

这被添加到

(-1)**1/(2*1+1)

然后去

(-1)**2/(2*2+1)

永远如此。求和在数学上被称为收敛和。

在Python中,您可以这样编写:

def estimate_pi(terms):
    result = 0.0
    for n in range(terms):
        result += (-1.0)**n/(2.0*n+1.0)
    return 4*result

如果你想稍微优化一下,你可以避免指数化。

def estimate_pi(terms):
    result = 0.0
    sign = 1.0
    for n in range(terms):
        result += sign/(2.0*n+1.0)
        sign = -sign
    return 4*result

....

>>> estimate_pi(100)
3.1315929035585537
>>> estimate_pi(1000)
3.140592653839794

使用纯Python可以执行以下操作:

def term(n):
    return ( (-1.)**n / (2.*n + 1.) )*4.

def pi(nterms):
    return sum(map(term,range(nterms)))

然后用达到给定精度所需的项数计算pi

pi(100)
# 3.13159290356

pi(1000)
# 3.14059265384

莱布尼茨公式直接翻译成Python,没有混乱或大惊小怪:

>>> steps = 1000000
>>> sum((-1.0)**n / (2.0*n+1.0) for n in reversed(range(steps))) * 4
3.1415916535897934

相关问题 更多 >