我正在尝试通过创建函数使用蒙特卡洛积分找到椭圆体的体积,并且该技术相对较新。我知道如何使用matplotlib在3D空间中绘制椭圆体,以及如何正常查找体积,但不确定蒙特卡洛技术如何适用于椭圆体体积。是否有示例代码可用于执行此操作?
我尝试用体积公式创建一个函数,并为大量值重复该函数,但是我正努力创建一个可以执行此操作的程序。
package.json
答案 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
循环)。