【问题标题】:Finding PI digits using Monte Carlo使用 Monte Carlo 查找 PI 数字
【发布时间】:2009-06-11 17:10:29
【问题描述】:

我已经尝试了许多算法来使用蒙特卡洛找到 π。 解决方案之一(在 Python 中)是这样的:

def calc_PI():
    n_points = 1000000
    hits = 0

    for i in range(1, n_points):
        x, y = uniform(0.0, 1.0), uniform(0.0, 1.0)

        if (x**2 + y**2) <= 1.0:
            hits += 1

    print "Calc2: PI result", 4.0 * float(hits) / n_points

可悲的是,即使是 1000000000,精度也非常差(3.141...)。

这是此方法可以提供的最大精度吗? 我选择蒙特卡洛的原因是它很容易在平行部分中分解。 有没有另一种易于分解计算的 π 算法?

【问题讨论】:

    标签: python statistics montecarlo pi


    【解决方案1】:

    这是蒙特卡洛的经典例子。但是,如果您想将 pi 的计算分解为并行部分,为什么不直接使用无限级数并让每个核心取一个范围,然后将结果求和?

    http://mathworld.wolfram.com/PiFormulas.html

    【讨论】:

    • 这是我的第一个方法。但我想玩一点蒙特卡洛,因为它可以用于许多领域。
    • 在难以找到公式时使用 Monte Carlo。在容易找到公式时使用公式。
    【解决方案2】:

    您的小数误差为sqrt(N)/N = 1/sqrt(N),因此这是一种非常低效的精确估算方法。这个限制是由测量的统计性质设定的,不能被超越。

    对于N throws,您应该能够获得大约floor(log_10(N))/2-1 的高精度数字。也许-2只是为了安全...

    即使它假设您使用的是真正的 RNG 或足够好的 PRNG。

    【讨论】:

      【解决方案3】:

      使用准随机数生成器 (http://www.nag.co.uk/IndustryArticles/introduction_to_quasi_random_numbers.pdf) 而不是标准的伪 RNG。准随机数比伪随机数更均匀地覆盖积分区域(您正在做的是 MC 积分),从而提供更好的收敛性。

      【讨论】:

      • 我天真的猜测是,虽然这收敛得更快,但估计置信范围可能更难。你知道关于这件事的任何文献吗?
      • 不,但是有一个 C 库 feynarts.de/cuba 实现了 MC 集成,包括置信范围(它返回一个绝对误差估计和估计错误的 Chi^2 概率)。您可以下载代码并查看实现,或通过电子邮件向作者索取他用于编写代码的文献。
      • 啊!作者链接到有关此事的论文。发表在 Computational Physics Communications 上(在 arXiv 上,arxiv.org/abs/hep-ph/0404043)。令我痛苦的是,他和我在同一行工作,这是第一次听说。哦!
      • 我的妻子在她的研究中广泛使用这个库。根据她的经验,对于低维,确定性方法(古巴图书馆中的常规“Cuhre”)优于 MC 积分,即使对于具有不连续性的“困难”被积函数也是如此。
      猜你喜欢
      • 1970-01-01
      • 2017-05-15
      • 2015-06-19
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多