球状ボリューム内にある粒子位置のランダムで均一なサンプルを生成できるようにしたいと考えています。
下の画像 ( http://nojhan.free.fr/metah/提供) は、私が探しているものを示しています。これは球をスライスしたもので、点が均一に分布していることを示しています。
これは私が現在得ているものです:
球座標とデカルト座標の間の変換により、中心に点のクラスターがあることがわかります。
私が使用しているコードは次のとおりです。
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)
以下は、 http://nojhan.free.fr/metahで与えられた方程式に似た、均一な球形のサンプルを作成すると思われる MATLAB コードです。私はそれを解読することも、彼らが何をしたかを理解することもできないようです.
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 で球体ボリュームから真に均一なサンプルを生成するための提案をいただければ幸いです。
均一な球殻からサンプリングする方法を示す例はたくさんあるようですが、それはより簡単な問題のようです。この問題はスケーリングに関係しています。球体のボリュームから均一なサンプルを生成するには、半径 1.0 よりも半径 0.1 の方がパーティクルの数が少ない必要があります。
編集:私が普通に頼んだという事実を修正して削除し、私は制服を意味しました.