Распределение частиц по объему, начиная с пары функций плотности

По сути, то, что я хочу сделать, это настроить начальные условия для моделирования галактики из n тел. Документ, который я пытался найти, находится здесь http://arxiv.org/abs/1204.0513.

В статье описываются две функции плотности:

  • функция поверхностной плотности формы rho (r) для плотности на расстоянии r от центра

  • и функция плотности формы rho (r, z), где z представляет собой компонент z в координатах (x, y, z).

Что я сделал до сих пор для каждой частицы (звезды):

  • используйте метод Монте-Карло с первой функцией, чтобы получить расстояние от центра галактики
  • используйте метод Монте-Карло со второй функцией, чтобы получить компонент z
  • случайным образом генерировать координаты x,y на окружности радиуса r на высоте z

Но, возможно, код для этого был бы более полезным:

/* generate 3 random numbers x,y,z having a domain from 0 to 1 (not including 0.0) */

// The distance from the galaxy center for the current star.
// Rs is a constant parameter in the surface density function.
float r = -Rs * log(1.0f - x);

// The z coordinate for the current star
float Sz = -0.5f * (0.1f * Rs) * log(-((z-1)/z));

// The x,y coordinates for the current star
float Sx = sqrt(r*r - Sz*Sz) * cos(2.0f * PI * y);
float Sy = sqrt(r*r - Sz*Sz) * sin(2.0f * PI * y);

Визуально это создает ожидаемую форму, пока не возникает очевидная ситуация, а именно, если сгенерированное значение Sz выше, чем сгенерированное значение r.

Итак, мой вопрос, во-первых, если я вообще на правильном пути, и если да, то может ли кто-нибудь предложить механизм коррекции для описанного выше случая или альтернативный метод генерации этих координат.


person andrei    schedule 14.01.2014    source источник


Ответы (1)


Я думаю, что у вас есть два основных варианта здесь. Вариант 1 будет принимать/отклонять — отбросить текущую попытку и попробовать еще раз, если сгенерированное значение Sz подтолкнет вас к порогу r. Вариант 2 — масштабировать результат — нормализовать три измерения до r, а затем масштабировать на случайное число, чтобы длина вектора была в некоторой пропорции ‹= r. Распределение значения масштабирования будет определять, насколько плотными будут результаты на разных радиусах, решение о моделировании, которое вам придется принять.

person pjs    schedule 14.01.2014
comment
Масштабирование результата - это то, чем я сейчас занимаюсь. Отклонение заданного Sz или генерация нового случайного z до тех пор, пока не будет подходящего, нежелательны из-за логики, лежащей в основе этого кода. - person andrei; 15.01.2014
comment
Генерация нового z до тех пор, пока он не подойдет, исказит распределение, результаты дадут условное распределение z при заданных x и y, а не совместное распределение x, y и z. - person pjs; 15.01.2014