我是这里的新会员,我会直接开车到这里来,因为我整个星期天都在努力想办法解决这个问题。
我是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
它本质上是平面上随机(x,y)坐标的发生器,从-1到+1,在两个轴上。如果x^2+y^2 <= 1,我们知道点位于由协调轴形成的盒内半径为1的圆内。
根据点的位置,对于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的值就会变得太大而无法处理,代码就会崩溃。我怎样才能解决这个问题?)
谢谢!
发布于 2016-01-17 08:50:36
第一个版本的算法应该更像这样:
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)
指纹:
3.14699146991
这更近了。增加n
,使其更接近pi。
算法只考虑单位圆的四分之一,即半径为1
。
四分之一圈面积的公式是:
area_c = (pi * r **2) / 4
对于包含这个圆圈的正方形区域:
area_s = r **2
其中r
是圆的半径。
现在的比率是:
area_c / area_s
用上面的方程式代替,然后你得到:
pi = 4 * (area_c / area_s)
去蒙特卡洛,用一个非常高的代表它们的数字代替这两个区域。通常,这里使用的是随机投掷的飞镖的类比。
发布于 2016-01-17 09:24:16
对于第一个问题,您的计算应该是
pi = incircle/1000000*4 # 3.145376..
这是圆圈内落在总点数之上的点数(在我跑步时大约是0.785671点)。
在半径为1 (random.uniform(-1,1)
)的情况下,总面积为4,因此,如果以圆圈内着陆点的比例乘以4,则得到正确的答案。
https://stackoverflow.com/questions/34840741
复制