具有相关参数的蒙特卡洛积分

Monte-Carlo Integration with dependent parameters

我想使用蒙特卡罗方法对下面给出的函数进行积分:

f(x,y,z) = (x**2 * y * z) + (y**2 * z**2 * x) + (x**3 * y**3 *z)

有限制:

0 <= x < 4,

0 <= y < 2*(x**2),

0 <= z < 1.

这是我到目前为止尝试过的方法。

from skmonaco import mcquad

def g(t):
   """
   The integrand.
   """
   x = t[0]
   y = t[1]
   z = t[2]

   f = (x**2 * y * z) + (y**2 * z**2 * x) + (x**3 * y**3 *z)

   return f

mcquad(g,npoints=100000,xl=[0., 0., 0.],xu=[4., 10., 1.],nprocs=4)

如果我在两个常量之间设置 y 的限制,我会得到正确的答案。例如:0 <= y < 10。有人可以告诉我如何根据 x 设置 y 的限制吗?

当 (x,y,z) 在域内时,令 h(x,y,z) 等于 f(x,y,z),否则为 0。

在更大的区域整合 h

0 <= x < 4,
0 <= y < 32,
0 <= z < 1

给我们相同的结果。

也就是我们可以运行下面的代码:

from skmonaco import mcquad

def g(t):
   """
   The integrand.
   """
   x, y, z = t
   if y < 2 * (x**2):
       return (x**2 * y * z) + (y**2 * z**2 * x) + (x**3 * y**3 *z)
   return 0

print(mcquad(g,npoints=100000,xl=[0., 0., 0.],xu=[4., 32, 1.],nprocs=4))