我刚刚开始编程,这项任务给我带来了很多麻烦。如何更改下面的蒙特卡罗代码(用于曲线下面积)以便估算pi?
from random import uniform
from math import exp
def estimate_area(f, a, b, m, n=1000):
hits = 0
total = m * (b - a)
for i in range(n):
x = uniform(a, b)
y = uniform(0, m)
if y <= f(x):
hits += 1
frac = hits / n
return frac * total
def f(x):
return exp(-x**2)
def main():
print(estimate_area(f, 0, 2, 1))
main()
非常感谢任何帮助。谢谢。
答案 0 :(得分:3)
我不会为你解决这个问题,但我会给你一个提示。考虑在2x2平方内嵌入unit circle,以及如何帮助您估算π。一旦你搞清楚了,就可以利用固有的对称性来处理四个象限中的一个。
答案 1 :(得分:0)
这是蒙特卡罗方法的常见示例,例如参见Monte Carlo Method上的维基百科页面。
仅在一个象限中考虑这个问题,因此四分之一圆以0,0为中心,半径为1,方形从(0,0)到(1,1)。
如果您在x=uniform(0,1)
和y=uniform(0,1)
的方格中随机添加一个点,则可以检查该点是否在四分之一圆圈(x^2.+y^2.)^0.5 <= 1.0
内。
这种情况发生的可能性与两个物体的体积比有关。