Распределите частицы равномерно внутри сферы с огромным радиусом (10 ^ 9) - Matlab - PullRequest
1 голос
/ 10 марта 2020

Мне нужна помощь в следующем:

   L2=10^9;
   nP=10^6;

   x(:,1)=L2.*rand(nP,1);
   y(:,1)=L2.*rand(nP,1);   % Select  initial partice position randomly (only positive values) NS
   z(:,1)= L2.*rand(nP,1);


   for ip=1:nP
      r1(ip,1)= sqrt(x(ip,1)^2 + y(ip,1)^2 + z(ip,1)^2);   % distance from (0,0,0) for each iteration

      while r1(ip,1)>=L2

         x(ip,1)=L2.*rand(1,1);
         y(ip,1)=L2.*rand(1,1);     % Select  initial partice position randomly (only positive values) NS
         z(ip,1)=L2.*rand(1,1);
         r1(ip,1)= sqrt(x(ip,1)^2 + y(ip,1)^2 + z(ip,1)^2);
      end
   end

Проблемы, с которыми я сталкиваюсь:

1) Поскольку радиус L2 очень большой, когда я умножаюсь на L2 с помощью rand Я получаю значения очень близко к границам прямоугольника (например, 10 ^ 8) и хочу, чтобы частицы были равномерно распределены по всей сфере.

2) Также после запуска команды while результирующие распределения не более равномерный.

1 Ответ

1 голос
/ 11 марта 2020

Концептуально это может быть выполнено в три этапа:

  1. Создание точек на поверхности единичной сферы;
  2. Масштабирование каждой точки для равномерного заполнения внутренней части сферы; и
  3. Масштабируйте их до желаемого радиуса.

На практике шаги можно комбинировать.

Обратите внимание, что я не пользователь Matlab, и при этом я не имейте его копию, поэтому, пожалуйста, относитесь к следующему псевдокоду.

Самый простой и общий способ генерировать точки, случайно распределенные по поверхности k -мерной сферы, избегая при этом подход принятия / отклонения состоит в том, чтобы генерировать k независимых стандартных нормалей и нормализовать каждую результирующую точку по ее расстоянию от начала координат. Для трех измерений:

x = randn
y = randn
z = randn
scale_factor = 1 / sqrt(x^2 + y^2 + z^2)
x = x * scale_factor
y = y * scale_factor
z = z * scale_factor

Чтобы масштабировать точки внутри сферы, вы хотите применить масштабный коэффициент от 0 до 1. Однако, если вы масштабируете коэффициент равномерно, результат не будет равен трем. размерно однородный. Обратите внимание, что сфера с радиусом 1/2 имеет только 1/8 объема единичной сферы, поэтому нам необходимо соответствующим образом отрегулировать масштабный коэффициент, чтобы сделать ожидаемое количество точек пропорциональным объему. Правильный масштабный коэффициент для k -мерной сферы состоит в том, чтобы взять k -й root равномерного (0,1) случайного числа (см. Wolfram * 1027). * для двумерной иллюстрации этого принципа), поэтому в вашем случае вы хотите отрегулировать масштабный коэффициент с помощью куба root. Измените scale_factor выше на:

scale_factor = (rand^(1/3)) / sqrt(x^2 + y^2 + z^2) 

Наконец, чтобы изменить масштаб до фактического желаемого радиуса L2, то, что вы действительно хотите:

scale_factor = L2 * (rand^(1/3)) / sqrt(x^2 + y^2 + z^2) 
...