Я ищу, чтобы иметь возможность генерировать случайный однородный образец местоположений частиц, которые попадают в сферический объем.
Изображение ниже (любезно предоставлено 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)
Ниже приведен некоторый код 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, чтобы создать однородный образец из объема сферы.
Изменить: Исправлено и устранено тот факт, который я попросил, и я имел в виду униформу.