π的莱布尼兹公式 - 这有什么用的吗? (蟒蛇)

时间:2013-08-03 19:16:06

标签: python python-3.x

我正在做一个练习,要求使用Leibniz公式近似pi的值。这些是对维基百科的解释:

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))

有谁知道更好的功能?

7 个答案:

答案 0 :(得分:4)

Leibniz公式直接转换为Python,没有任何麻烦或烦恼:

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

答案 1 :(得分:1)

使用纯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

答案 2 :(得分:1)

这里的首都西格玛是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

答案 3 :(得分:0)

这是我的方法:

def estPi(terms):
    outPut = 0.0
    for i in range (1, (2 * terms), 4):
        outPut = (outPut + (1/i) - (1/(i+2)))
    return 4 * outPut

我输入用户想要的术语数,然后在for循环中将其加倍以仅考虑赔率。

at 100 terms I get        3.1315929035585537
at 1000 terms I get       3.140592653839794
at 10000 terms I get      3.1414926535900345
at 100000 terms I get     3.1415826535897198
at 1000000 terms I get    3.1415916535897743
at 10000000 terms I get   3.1415925535897915
at 100000000 terms I get  3.141592643589326
at 1000000000 terms I get 3.1415926525880504
Actual Pi is              3.1415926535897932

喜欢上收敛的系列。

答案 4 :(得分:0)

def myPi(iters):
    pi = 0
    sign = 1
    denominator = 1

    for i in range(iters):
        pi = pi + (sign/denominator)
        # alternating between negative and positive
        sign = sign * -1
        denominator = denominator + 2

    pi = pi * 4.0
    return pi

pi_approx = myPi(10000)
print(pi_approx)

答案 5 :(得分:0)

旧线程,但是我想解决这个问题,巧合的是,我想出了和user3220980差不多的东西

# gregory-leibnitz
# pi acurate to 8 dp in around 80 sec
# pi to 5 dp in .06 seconds
import time
start_time = time.time()

pi = 4 # start at 4
times = 100000000

for i in range(3,times,4):
        pi -= (4/i) + (4/(i + 2))
    
print(pi)
print("{} seconds".format(time.time() - start_time))

答案 6 :(得分:-1)

以下版本使用了this SO post中概述的Ramanujan公式 - 它使用了pi和"怪物组"之间的关系,如this article中所述

import math

def Pi(x):
    Pi = 0
    Add = 0
    for i in range(x):
        Add =(math.factorial(4*i) * (1103 + 26390*i))/(((math.factorial(i))**4)*(396**(4*i)))
        Pi = Pi + (((math.sqrt(8))/(9801))*Add)
    Pi = 1/Pi
    print(Pi)

Pi(100)