Стабильный диск для моделирования NNN-тела

Я хочу смоделировать галактику Н частицы, которые я должен сгенерировать в первую очередь. То, что я сделал до сих пор, не приводит к результату, который я хочу видеть. Я, наверное, сделал ошибку и не вижу ее. Вот что я сделал:

1) Генерировать равномерно распределенные частицы внутри единичного круга с массой м я "=" 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);

Делая это, я получаю следующее распределение:

т=0

2) Сгенерируйте скорости так, чтобы круг не взорвался и не схлопнулся:

Я хочу сгенерировать что-то, где Ф Сила тяжести "=" Ф центробежный

С Ф центробежный "=" м в 2 р и Ф Сила тяжести "=" г М ( р ) м р 2 Я могу приравнять оба уравнения и получить скорость в

М ( р ) это масса внутри радиуса р . я могу написать М малыш "=" π р 2 и М "=" π р 2 (плотность р "=" 1 ). Из этих уравнений я получаю М ( р ) "=" р 2 р 2 М малыш . Теперь я могу положить его обратно в и получить:

в "=" г р 2 М малыш р р 2

С М малыш "=" г "=" р "=" 1 Я получил:

в "=" р

Итак, для каждой точки я делаю:

   velocity = sqrt(radius);
   v_x = -velocity*sin(phi);
   v_y = velocity*cos(phi);

Тогда я получаю следующий результат:

т=1

т=4

т=7 т=10

Хорошо, кажется, что круг как-то взрывается. Частицы из центра движутся наружу. Мой расчет для в неправильно, или это просто не работает для моей цели? Нужно ли мне другое распределение скорости? В итоге для больших т , я не вижу формирования спиральных рукавов или какой-либо другой структуры. Я пытался Н "=" 4000 и Н "=" 50000 . Нужно ли мне больше частиц? Я что-то не так?

для phiскоростей следует выбирать случайным образом (равномерным по [ 0 , 2 π ) ).
@AccidentalFourierTransform Я так делаю. Я беру то же, что phiя уже беру за положение частицы. Это неправильно? Должен ли я генерировать phiвторой раз для скорости?
да, это неправильно, и да, вам нужно генерировать phiскорость во второй раз (подумайте, почему!).
@AccidentalFourierTransform Я не понимаю, почему я должен брать еще один файл phi. Это означало бы, что скорость не является тангенциальной. И не будет ли это означать, что я получу круг случайно движущихся точек вместо вращения твердого тела?
Принимая одно и то же phiкак для положения, так и для скорости, вы делаете все скорости радиальными (т. е. без тангенциальной составляющей). В этом причина первоначального «внешнего взрыва».
@AccidentalFourierTransform Но вместо этого у меня происходит «внутренний взрыв». Поскольку частицы движутся хаотично, двумерная сфера коллапсирует. Не может быть, чтобы образовалась спиральная структура. Или я ошибаюсь? Я только что проверил это с Н "=" 3000 и это похоже на звездное скопление без какой-либо структуры.
Если распределение ф в однородна, то исходный кластер не имеет углового момента. Вы можете попробовать с неоднородным ф в .

Ответы (1)

Ваша логика верна, включая выбор тангенциальной скорости как

 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должен быть достаточно мал, чтобы общая энергия сохранялась на одну тысячную или лучше.

Я использовал древовидный алгоритм с интегратором Рунге-Кутта. Правилен ли мой подход, если я использую сферу (3D)?
Вы можете присвоить тангенциальные скорости в равновесии частицам в сфере, но сфера не будет вращаться и не будет диском. Вы использовали смягчение? Как именно вы решили, когда открывать ячейку с кодом дерева? -- возможно, вы не были осторожны с этим и столкнулись с "ошибкой взрывающихся галактик"?
Я уже смоделировал сферу Пламмера и получил хорошие результаты. Поэтому я думаю, что есть проблема с начальным условием скорости. Я попробовал вашу идею, но получил худшие результаты. Сфера взрывается. Но в самом начале видны какие-то спиральные рукава! Может быть, я сделал что-то не так. Не могли бы вы реализовать свою идею и показать, как получить правильную скорость для такой системы? Это было бы прекрасно.
К сожалению, Вы не предоставили достаточно информации. Как/какие ускорения? Насколько хорошо сохраняются полная энергия, линейный и угловой момент????