Я хочу смоделировать галактику частицы, которые я должен сгенерировать в первую очередь. То, что я сделал до сих пор, не приводит к результату, который я хочу видеть. Я, наверное, сделал ошибку и не вижу ее. Вот что я сделал:
1) Генерировать равномерно распределенные частицы внутри единичного круга с массой :
Для каждой точки я делаю:
R = 1;
radius = R*sqrt(rand(0,1));
phi = rand(0,2*pi);
m = 1/N;
x = radius*cos(phi);
y = radius*sin(phi);
Делая это, я получаю следующее распределение:
2) Сгенерируйте скорости так, чтобы круг не взорвался и не схлопнулся:
Я хочу сгенерировать что-то, где
С и Я могу приравнять оба уравнения и получить скорость
это масса внутри радиуса . я могу написать и (плотность ). Из этих уравнений я получаю . Теперь я могу положить его обратно и получить:
С Я получил:
Итак, для каждой точки я делаю:
velocity = sqrt(radius);
v_x = -velocity*sin(phi);
v_y = velocity*cos(phi);
Тогда я получаю следующий результат:
Хорошо, кажется, что круг как-то взрывается. Частицы из центра движутся наружу. Мой расчет для неправильно, или это просто не работает для моей цели? Нужно ли мне другое распределение скорости? В итоге для больших , я не вижу формирования спиральных рукавов или какой-либо другой структуры. Я пытался и . Нужно ли мне больше частиц? Я что-то не так?
Ваша логика верна, включая выбор тангенциальной скорости как
x = r*cos(phi);
y = r*sin(phi);
vx=-v*sin(phi);
vy= v*cos(phi);
Где вы (пытались) установить v
центробежный баланс. Однако гравитационное притяжение диска отличается от притяжения сферы, в частности, ваше предположение о том, что ускорение равно GM(r)/r^2, неверно. Лучший способ найти правильную форму — получить силы из вашей модели N тел и взять среднее азимутальное радиальное ускорение в радиальных бинах. Ваша исходная модель должна удовлетворять теореме вириала , то есть кинетическая энергия должна быть в 0,5 раза больше гравитационной.
Но как вы рассчитали силы и как интегрировали уравнения движения? Вы должны избегать точных сил N тел, потому что они расходятся при близких столкновениях и вместо этого используют смягченные силы . По сути, вы добавляете для каждого взаимодействия частица-частица постоянное вертикальное смещение h
, длину смягчения . Установите это примерно в 0,1 раза больше радиуса.
Интеграцию по времени лучше всего выполнять с помощью интегратора чехарды. Например
for(I:particles)
I.vel += 0.5*tau*I.acc
I.pos += tau*I.vel
time += tau
compute_accelerations(particles);
for(I:particles)
I.vel += 0.5*tau*I.acc
интегрировать один временной шаг длины tau
. Конечно, вы должны вычислить начальные ускорения перед первым шагом. Размер шага tau
должен быть достаточно мал, чтобы общая энергия сохранялась на одну тысячную или лучше.
СлучайныйПреобразование Фурье
phi
скоростей следует выбирать случайным образом (равномерным поГилфойл
phi
я уже беру за положение частицы. Это неправильно? Должен ли я генерироватьphi
второй раз для скорости?СлучайныйПреобразование Фурье
phi
скорость во второй раз (подумайте, почему!).Гилфойл
phi
. Это означало бы, что скорость не является тангенциальной. И не будет ли это означать, что я получу круг случайно движущихся точек вместо вращения твердого тела?СлучайныйПреобразование Фурье
phi
как для положения, так и для скорости, вы делаете все скорости радиальными (т. е. без тангенциальной составляющей). В этом причина первоначального «внешнего взрыва».Гилфойл
СлучайныйПреобразование Фурье