我正在做一个练习,要求使用Leibniz公式近似pi的值。这些是对维基百科的解释:
逻辑思维很容易找到我,但我没有接受过很多关于数学的正规教育,所以我对第二个最左边的符号代表什么感到遗憾。我尝试编写代码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))
有谁知道更好的功能?
答案 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)