@AmV: его иногда называют основным законом выборки. Я обсуждаю это в других контекстах в двух ссылках в моем ответе здесь. Вы нормализуете свой PDF, интегрируете, затем инвертируете его и используете результирующую функцию для преобразования значений, нарисованных равномерно по [0,1). В этом случае все сводится к получению кубического корня.

еюсь, что смогу сгенерировать случайный однородный образец местоположений частиц, которые попадают в сферический объем.

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

Редактировать: Исправлено и убрано то, что я обычно просил и имел в виду униформу

Ответы на вопрос(8)

Ваш ответ на вопрос