在球体体积内均匀抽样分布的随机点

8 浏览
0 Comments

在球体体积内均匀抽样分布的随机点

我希望能够生成一个落在球形体积内的粒子位置的随机均匀样本。

下面的图片(由http://nojhan.free.fr/metah/提供)展示了我所期望的情况。这是一个球体的切片,显示了均匀分布的点:

Uniformly distributed circle

这是我目前得到的结果:

Uniformly Distributed but Cluster Of Points

你可以看到中心有一个点的集群,这是由于球坐标和笛卡尔坐标之间的转换造成的。

我正在使用以下代码:

def new_positions_spherical_coordinates(self):
   radius = numpy.random.uniform(0.0,1.0, (self.number_of_particles,1)) 
   theta = numpy.random.uniform(0.,1.,(self.number_of_particles,1))*pi
   phi = numpy.arccos(1-2*numpy.random.uniform(0.0,1.,(self.number_of_particles,1)))
   x = radius * numpy.sin( theta ) * numpy.cos( phi )
   y = radius * numpy.sin( theta ) * numpy.sin( phi )
   z = radius * numpy.cos( theta )
   return (x,y,z)

下面是一些MATLAB代码,据说可以创建一个均匀的球形样本,这与http://nojhan.free.fr/metah给出的方程类似。我只是无法解读它或理解他们做了什么。

function X = randsphere(m,n,r)
% This function returns an m by n array, X, in which 
% each of the m rows has the n Cartesian coordinates 
% of a random point uniformly-distributed over the 
% interior of an n-dimensional hypersphere with 
% radius r and center at the origin.  The function 
% 'randn' is initially used to generate m sets of n 
% random variables with independent multivariate 
% normal distribution, with mean 0 and variance 1.
% Then the incomplete gamma function, 'gammainc', 
% is used to map these points radially to fit in the 
% hypersphere of finite radius r with a uniform % spatial distribution.
% Roger Stafford - 12/23/05
X = randn(m,n);
s2 = sum(X.^2,2);
X = X.*repmat(r*(gammainc(s2/2,n/2).^(1/n))./sqrt(s2),1,n);

我非常感谢在Python中生成一个真正均匀的球体样本的任何建议。

似乎有很多示例展示了如何从均匀的球形壳中采样,但这似乎是一个更容易的问题。问题与缩放有关 - 在半径为0.1的位置应该比在半径为1.0的位置有更少的粒子,以生成球体体积的均匀样本。

编辑:修复并移除我要求正态分布的事实,我意思是均匀分布。

0