【发布时间】:2016-04-22 19:09:47
【问题描述】:
我是这里的新成员,我将直接进入这个问题,因为我整个星期天都在努力解决这个问题。
我是 Python 新手,之前学习过 C++ 编码,达到中级水平(这是一个为期 10 周的大学模块)。
我正在尝试几种迭代技术来计算 Pi,但两者都略有不准确,我不知道为什么。
我在大学里学到的第一种方法——我相信你们中的一些人以前见过它。
x=0.0
y=0.0
incircle = 0.0
outcircle = 0.0
pi = 0.0
i = 0
while (i<100000):
x = random.uniform(-1,1)
y = random.uniform(-1,1)
if (x*x+y*y<=1):
incircle=incircle+1
else:
outcircle=outcircle+1
i=i+1
pi = (incircle/outcircle)
print pi
它本质上是一个生成器,用于在两个轴上从 -1 到 +1 的平面上生成随机 (x,y) 坐标。那么如果 x^2+y^2
根据点的位置,incircle 或 outcircle 的计数器会增加。
那么 pi 的值就是圆内和圆外值的比率。坐标是随机生成的,所以应该是均匀分布的。
但是,即使在非常高的迭代值下,我对 Pi 的结果始终在 3.65 左右。
第二种方法是另一种迭代,它随着边数的增加计算多边形的周长,直到多边形几乎是一个圆,然后,Pi=周长/直径。 (我有点作弊,因为编码有一个 math.cos(Pi) 术语,所以看起来我正在使用 Pi 来查找 Pi,但这只是因为你不能轻易地使用度数来表示 Python 上的角度)。但即使是高迭代,最终结果似乎也会在 3.20 左右结束,这又是错误的。代码在这里:
S = 0.0
C = 0.0
L = 1.0
n = 2.0
k = 3.0
while (n<2000):
S = 2.0**k
L = L/(2.0*math.cos((math.pi)/(4.0*n)))
C = S*L
n=n+2.0
k=k+1.0
pi = C/math.sqrt(2.0)
print pi
我记得,在我上 C++ 课程时,有人告诉我这个问题很常见,不是因为数学,而是因为编码中的某些东西,但我记不清了。这可能与随机数生成有关,也可能与使用浮点数的限制有关,或者……任何事情。它甚至可能只是我的数学......
谁能想到问题出在哪里?
TL;DR:尝试计算 Pi,我可以接近它,但永远不会非常准确,无论我做了多少次迭代。
(哦,还有一点 - 在第二个代码中有一行说 S=2.0**k。如果我将“n”设置为高于 2000 的任何值,则 S 的值会变得太大而无法处理,并且代码会崩溃。我该如何解决这个问题?)
谢谢!
【问题讨论】:
-
这是一道数学题。 Monte-Carlo 方法给出了 pi 的近似值,而不是 pi 本身。 This 应该更准确。
-
我还注意到 python 的计算有时会有些偏差。例如,当应用
tan(45)度时,它返回 0.99999... 而不是 1。 -
@AshwinGupta 这不仅仅是 Python 的缺点,而是任何实现浮点运算的语言。此外,tan(45) 等于 1。
-
你试过
math.pi吗? -
@Reti43 我的意思是棕褐色 45。错字。
标签: python python-2.7 numeric montecarlo pi