montecarlo与Python的集成

montecarlo与Python的集成,python,integration,montecarlo,Python,Integration,Montecarlo,用蒙特卡罗积分估计以下积分: 我试图对下面的问题进行蒙特卡罗积分,其中p(x)是一个均值为1、方差为2的高斯分布。(见图) 有人告诉我,一旦我们从正态分布中提取样本,pdf就会消失在积分中。请解释这个概念,以及我如何用Python解决这个问题。下面是我的尝试 def func(x): return (math.exp(x))*x mu = 1 sigma = sqrt(2) N = 1000 areas = [] for i in range(N): xrand = np.zeros

用蒙特卡罗积分估计以下积分:

我试图对下面的问题进行蒙特卡罗积分,其中p(x)是一个均值为1、方差为2的高斯分布。(见图)

有人告诉我,一旦我们从正态分布中提取样本,pdf就会消失在积分中。请解释这个概念,以及我如何用Python解决这个问题。下面是我的尝试

def func(x):
return (math.exp(x))*x

mu = 1
sigma = sqrt(2)
N = 1000
areas = []
for i in range(N):
    xrand = np.zeros(N)

    for i in range (len(xrand)):
        xrand[i] = np.random.normal(mu, sigma)
        integral = 0.0

    for i in range (N):
        integral += func(xrand[i])/N

    answer = integral
    areas.append(answer)

plt.title("Distribution of areas calculated")
plt.hist(areas, 60, ec = 'black')
plt.xlabel("Areas")

integral

蒙特卡罗积分是一种近似复积分的方法,无需计算其闭式解。为了回答你的问题,PDF消失了,因为你所需要做的就是1)从指定的正态分布中抽取一些随机值,2)计算被积函数的值,3)计算这些值的平均值。请注意,PDF在计算中变得无关;它只与确保更频繁地采样更可能的值相关。如果这能让事情更直观的话,你可能会把它理解为加权平均

这是一个基于原始源代码的Python实现

def func(x):
返回x*math.exp(x)
def蒙特卡罗(n_样本,μ,σ):
val_lst=[]
对于范围内的(n样本):
x=np.随机.正态(μ,σ)
附加值(函数(x))
返回平均值(val_lst)
您可以将
func
更改为您选择的任何函数,以执行该函数的蒙特卡罗近似。如果给定了不同的概率分布,您还可以编辑
monte_carlo
函数的参数

这是一个函数,您可以使用它来可视化蒙特卡罗近似的逐渐收敛。正如您所期望的,这些值将随着更大的迭代而收敛,即当您增加
n_sample
的值时

MAX_SAMPLE=200#根据需要调整此值
x=np.arange(最大样本)
y=[x中i的蒙特卡罗(i,1,sqrt(2)]]
平面图(x,y)
plt.show()
结果图将显示收敛值,这是从定积分的闭合形式解计算出的值的近似值