我是这里的新成员,我将一整天都在努力,直到我努力解决这个问题。
我是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 <= 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的值太大而无法处理,并且代码崩溃。我该怎么办?解决这个问题?)
谢谢!
您的第一个版本的算法应如下所示:
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)
前往蒙特卡洛,只需用代表它们的非常高的数字替换这两个区域。通常,这里使用随机投掷飞镖的类比。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句