【问题标题】:Monte carlo area of a circle圆的蒙特卡罗面积
【发布时间】:2022-01-11 15:42:54
【问题描述】:

是否可以使用蒙特卡罗来计算半径大于 1 的圆的面积? 我试图这样做,但它只适用于半径为 1 的圆。

N = 10000
incircle = 0
count = 0
while (count<N)
 x = random()
 y = random()
 if sqrt((x-a)^2 +(y-b)^2) <= R then
    incircle = incircle+1
 endif
 count = count+1

so

【问题讨论】:

  • 我假设: * a 和 b 是圆的中心 (0.5) * 带有 sqrt 的 if 添加了缺少的括号 * while 循环中的 cpt 实际上是计数 * R 是 0.5 在你的case (或者它是 1 但它不是半径,它是直径)然后你会看到一个不同半径的圆只是浪费时间,因为你将方程的所有项乘以一个常数。
  • 已更正,是的。所以简而言之,对于半径为 2 的圆,我必须得到一个介于 0 和 2 之间而不是介于 0 和 1 之间的随机数?
  • 是的:基本上你必须在围绕圆圈构建的正方形中“发射”一个随机点。如果圆的半径为 1,则表示正方形的边为 2。每次发射一个点,然后检查它是否落在圆内。最后,通过计算“发射”点与落在圆内的点之间的比率,您可以减去圆的面积,从而得出 Pi。

标签: simulation montecarlo surface stochastic-process


【解决方案1】:

不知道你用的是什么语言,但我会用 Python 编写以下代码,希望你能理解。

我对半径2的圆的面积计算情况进行了计算。

这里的蒙特卡洛算法如下。让我们在[-R ; R] 范围内创建一个具有XY 的正方形。现在让我们在这个正方形内随机均匀地生成点。我们将计算生成点的总数和半径为R 的圆内的点数,以给定正方形为界。如果X^2 + Y^2 &lt;= R^2,则点落入圆内,否则位于圆外。最后正方形的面积是(2 * R)^2,而圆形的面积(大约)等于num_points_in_circle / num_points_total-正方形面积的第一个部分。

在控制台输出中,我还显示了error,它显示了与通过公式Pi * R^2精确计算的期望值的绝对差。

在 Python 中,x ** 2 表示 x 提升到 2 的幂。

Try it online!

import random, math
R = 2
niters = 300_000
total, in_circle = 0, 0
for j in range(20):
    for i in range(niters):
        x = random.uniform(-R, R)
        y = random.uniform(-R, R)
        if x ** 2 + y ** 2 <= R ** 2:
            in_circle += 1
        total += 1
    area = (2 * R) ** 2 * in_circle / total
    expected = math.pi * R ** 2
    print(f'After {(j + 1) * niters:>8} iterations area is {area:.08f}, ' +
        f'error is {abs(area - expected):.08f}', flush = True)

输出:

After   300000 iterations area is 12.59130667, error is 0.02493605
After   600000 iterations area is 12.58341333, error is 0.01704272
After   900000 iterations area is 12.58072889, error is 0.01435827
After  1200000 iterations area is 12.57965333, error is 0.01328272
After  1500000 iterations area is 12.57741867, error is 0.01104805
After  1800000 iterations area is 12.57348444, error is 0.00711383
After  2100000 iterations area is 12.57067429, error is 0.00430367
After  2400000 iterations area is 12.57078000, error is 0.00440939
After  2700000 iterations area is 12.56853926, error is 0.00216864
After  3000000 iterations area is 12.56956800, error is 0.00319739
After  3300000 iterations area is 12.56826182, error is 0.00189120
After  3600000 iterations area is 12.56863111, error is 0.00226050
After  3900000 iterations area is 12.56763897, error is 0.00126836
After  4200000 iterations area is 12.56839238, error is 0.00202177
After  4500000 iterations area is 12.56855111, error is 0.00218050
After  4800000 iterations area is 12.56861667, error is 0.00224605
After  5100000 iterations area is 12.56857725, error is 0.00220664
After  5400000 iterations area is 12.56881185, error is 0.00244124
After  5700000 iterations area is 12.56925193, error is 0.00288132
After  6000000 iterations area is 12.56927733, error is 0.00290672

【讨论】:

  • 在这种情况下,方差是 var = math.sqrt((in_circle^2-areap 2)/(total-1))?我试过了,如果你有时间,请告诉我你的看法
  • @Rasule 我不知道方差的确切公式。您的意思是我的代码中的计算误差小于预期的误差方差吗?是好是坏?
  • 哦,好吧。不,您的代码很好。我只是在检查置信区间。
最近更新 更多