如何使用蒙特卡洛积分找到椭圆体的体积

时间:2019-01-15 13:52:20

标签: python montecarlo

我正在尝试通过创建函数使用蒙特卡洛积分找到椭圆体的体积,并且该技术相对较新。我知道如何使用matplotlib在3D空间中绘制椭圆体,以及如何正常查找体积,但不确定蒙特卡洛技术如何适用于椭圆体体积。是否有示例代码可用于执行此操作?

我尝试用体积公式创建一个函数,并为大量值重复该函数,但是我正努力创建一个可以执行此操作的程序。

package.json

3 个答案:

答案 0 :(得分:1)

import random

def ellipsoid(x, y, z, a, b, c):
    return x**2/a**2 + y**2/b**2 + z**2/c**2

def V_ellipsoid(a, b, c, N):
    sum = 0
    for i in range(N):
        x = random.uniform(-a, a)
        y = random.uniform(-b, b)
        z = random.uniform(-c, c)
        if ellipsoid(x,y,z,a,b,c) <= 1:
            sum += 1
        volume = (sum/N)*(2*a)*(2*b)*(2*c)
    return volume

答案 1 :(得分:0)

由于我正在尝试提高我在 numpy 方面的知识,我将使用该库发布一个解决方案,这在 3D 问题中会很方便,这可能需要很多点才能收敛:

import numpy as np

#Desided number of samples and parameters
samples = 500000
A = 1; B = 2; C = 3

#Function to decide if the points are inside de ellipsoid
ellipsoid = lambda x,y,z,a,b,c: ((x/a)**2 + (y/b)**2 + (z/c)**2)

#generating x,y,z coordinates of random points in a cube the enclosure the
#ellipsoid (the np.ceil is just to work with integers)
X = np.random.random(samples)*2*np.ceil(A) - np.ceil(A)
Y = np.random.random(samples)*2*np.ceil(B) - np.ceil(B)
Z = np.random.random(samples)*2*np.ceil(C) - np.ceil(C)

#points inside the ellipsoid
inside = (ellipsoid(X,Y,Z,A,B,C) <= 1).sum()

cube_area = np.ceil(A)*np.ceil(B)*np.ceil(C)*8

volume = (inside/samples)*cube_area

real_volume = (4/3)*np.pi*A*B*C

print(volume,real_volume)

答案 2 :(得分:0)

具体的蒙特卡罗技术称为拒绝采样。在这种情况下,您应该对包含完整椭球的立方体进行采样,计算椭球和立方体中点数的比率,并将其乘以立方体的体积。代码如下:

import numpy as np

a = 2
b = 3
c = 4

n_samples = 100000

x = np.random.uniform(-a, a, n_samples)
y = np.random.uniform(-b, b, n_samples)
z = np.random.uniform(-c, c, n_samples)

distance = (x/a)**2 + (y/b)**2 + (z/c)**2

n_ok = np.sum(distance < 1.)
volume_cube = 8. * a * b * c
volume = volume_cube * n_ok / n_samples

我的代码与其他回复类似,但速度更快(没有 for 循环)。