无法在Python上精确计算pi

2024-10-03 19:20:15 发布

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

我是这里的新成员,我要直接开车去,因为我已经花了整个星期天的时间来想办法解决这个问题。在

我是Python的新手,以前已经学习过C++的基本中间层编码(它是一个10周的大学模块)。在

我正在尝试一些迭代技术来计算π,但是两种方法都有点不准确,我不知道为什么。在

我在大学里教的第一种方法-我相信你们中的一些人以前见过这种方法。在

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<;=1,我们知道点位于坐标轴形成的方框内半径为1的圆内。在

根据点的位置,incircle或{}的计数器增加。在

pi的值就是圆内外值的比值。坐标是随机生成的,所以它应该是均匀分布。在

然而,即使在非常高的迭代值下,Pi的结果也总是在3.65左右。在

第二种方法是另一种迭代,它计算多边形的周长,随着边数的增加,直到多边形几乎是一个圆,然后Pi=周长/直径。(我有点作弊,因为编码有一个数学.cos(π)项,所以看起来我是用π来求π,但这仅仅是因为在Python上不能很容易地使用度数来表示角度)。但即使是高迭代,最终结果似乎在3.20左右结束,这也是错误的。代码在这里:

^{pr2}$ 我记得,当我做C++课程时,被告知问题是常见的,不是因为数学,而是因为编码中的东西,但是我记不清了。它可能与随机数的生成有关,或者使用浮点数的局限性,或者。。。什么都可以。它甚至可以是我的数学。。。在

有人能想到问题是什么吗?在

DR:试图计算Pi,我可以接近它,但无论我做多少次迭代,都不能非常精确。在

(哦,还有一点-在第二个代码中,有一行写着s=2.0**k。如果我将'n'设置为任何高于2000的值,s的值就会变得太大而无法处理,代码就会崩溃。我怎样才能解决这个问题?)在

谢谢!在


Tags: 方法代码编码时间pi成员数学random
2条回答

对于第一个,你的计算应该是

pi = incircle/1000000*4  # 3.145376..

这是落在圆圈内的点数超过总点数(在我的跑步中大约是0.785671)。在

半径为1(random.uniform(-1,1))时,总面积为4,因此,如果用落在圆内的点的比率乘以4,就得到了正确的答案。在

第一个版本的算法应该更像这样:

from __future__ import division, print_function

import sys
if sys.version_info.major < 3:
    range = xrange

import random 


incircle = 0
n = 100000
for n in range(n):
    x = random.random()
    y = random.random()
    if (x*x + y*y <= 1):
        incircle += 1
pi = (incircle / n) * 4
print(pi)

印刷品:

^{pr2}$

这更近了。增加n以更接近pi。在

algorithm只考虑单位圆的四分之一,即半径为1。在

四分之一圆面积的公式为:

area_c = (pi * r **2) / 4

对于包含此圆的正方形的面积:

area_s = r **2

其中r是圆的半径。在

现在的比率是:

area_c / area_s

代入上面的方程式,重新排列,得到:

pi = 4 * (area_c / area_s)

在蒙特卡洛,用一个代表它们的非常高的数字来代替这两个区域。通常,这里使用随机投掷飞镖的类比。在

相关问题 更多 >