Войти
ПрограммированиеФорумФизика

Гравитация при х/0 и х/100500

Страницы: 1 2 3 Следующая »
#0
(Правка: 20:03) 20:01, 7 дек. 2019

Мне что-то подсказывает что тема заезженная, но все же...

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

С реализацией проблем нет, а вот с формулами бида. Дело в том что я рассчитываю гравитационное взаимодействие через формулу:
CodeCogsEqn | Гравитация при х/0 и х/100500
где m и p это массы и двумерные позиции точек, а G - условная гравитационная постоянная.

Если массы единичные а разницу позиций записать через d то получиться нормализированное d разделенное на свою же длину в квадрате:
CodeCogsEqn(1) | Гравитация при х/0 и х/100500
И с этим тоже все понятно, ведь это просто.

Но проблема в том что в случае d = 0 получаются бесконечности (ну или неопределенности).
И даже если ввести ограничение на d != 0 то вблизи нуля частицы все ровно распидорасит, т.к. формуле вообще пофиг делить на 0 или на 0.0000001.

Так вот, что с этим лучше всего сделать (для демки)? Ввести силу расталкивания?
Или тупо свести точки к случаю сферы с равномерным распределением массы и тогда 0 получится сам собой?

Желательно чтобы это было и логично, и красиво.
Спасибо.


#1
20:31, 7 дек. 2019

Great V.
1. Добавить каждой твоей точке радиус, описывающий сферу, и ввести понятие "столкновения". Что делать на столкновения - уже сам решай. Я бы просто слеплял 2 точки вместе для начала.
2. Делать переменный шаг интегрирования. Считаешь новую позицию для тела, и считаешь ускорение в этой новой позиции. Если ускорение меняется слишком сильно - делишь шаг времени пополам. Если ускорение меняется очень слабо - то можешь умножить шаг на два. Для интегрирования с переменным шагом удобно использовать priority queue.

#2
0:22, 8 дек. 2019

Great V.
> если ввести ограничение на d != 0 то вблизи нуля частицы все ровно ... т.к. формуле вообще пофиг делить на 0 или на 0.0000001.

Я стесняюсь спросить, но все таки, а как частицы должны себя вести вблизи 0?

#3
(Правка: 10:33) 9:34, 8 дек. 2019

Ввести модифицированную формулу гравитации, используя в знаменателе не abs(p2-p1), а

(abs(p2-p1)*abs(p2-p1) + С) / (abs(p2-p1) + 1)

#4
9:46, 8 дек. 2019

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

#5
15:20, 8 дек. 2019

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

#6
(Правка: 16:17) 16:14, 8 дек. 2019

Parfen Rogozhin
Но это:
1. Не физически корректно.
2. Не решает проблему, ведь на расстояниях близких к ε все ровно будут получатся большие числа.

Dmitry_Milk
> Ввести модифицированную формулу гравитации
Я что-то не улавливаю смысл этой формулы. Можешь расписать ее полностью, чтобы было видно как она соотноситься с F?
Ну и да, тоже получается не физически корректно.

rcsim
> а как частицы должны себя вести вблизи 0?
Из того что я знаю науке в принципе неизвестно как ведет себя гравитация на столь малых масштабах.
Потому что сама сила весьма слабая и проявляется на больших масштабах и массах. А на уровне элементарных частиц это скорее всего выходит за пределы погрешности + влияют внешние факторы.

MrShoor
> Добавить каждой твоей точке радиус, описывающий сферу
Я пока так и сделал.
> и ввести понятие "столкновения"
А вот от этого отказался. Если начинать считать все эти столкновения (пусть даже со склеиванием) то там нужно будет полноценную физику пилить, а этого не хочется.
Да и не физически все это.
> Я бы просто слеплял 2 точки вместе для начала.
Это вообще треш какой-то. По идее они должны пролетать друг сквозь друга.
> Делать переменный шаг интегрирования.
Это вообще ничего не изменит.
Вообще проблема в том что возникают запредельные скорости вблизи нуля/до единицы.
В природе такого нет. Либо потому что таких сближений вообще не происходит из-за других расталкивающих сил, либо потому что формула в принципе не верная и чего-то не учитывает (например логарифмическое падение силы до единицы).

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

#7
(Правка: 18:06) 18:05, 8 дек. 2019

Great V.
> нужно будет полноценную физику пилить, а этого не хочется.
> Да и не физически все это.

Полноценная физика нефизична?
Что что?
Но ептыть, в физике при столкновении тел как раз начинают действовать силы отталкивания, а если сил отталкивания нет как в столкновении материи и антиматерии, то всё аннигилирует в свет и нейтрино.
Какая физика тебе нужна?
И вообще в любом учебнике написано, что закон тяготения в таком виде он для точечных масс.
А точечная масса - это важное понятие в физике которое надо понимать.

#8
(Правка: 18:11) 18:10, 8 дек. 2019

P.S.

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

#9
(Правка: 18:37) 18:34, 8 дек. 2019

Great V.
> Да и не физически все это.
Очень даже физично. У всех тел в космосе есть радиусы.

Great V.
> Это вообще ничего не изменит.
> Вообще проблема в том что возникают запредельные скорости вблизи нуля/до
> единицы.
Твои запредельные скорости возникают из-за запредельного ускорения, которое ты прикладываешь на весь свой дельтатайм. В действительности за этот дельтатайм тело успевает оборачиваться вокруг другого тела, и успевает начать адекватно разлетаться. Ты же прикладываешь это ускорение мгновенно, и никаких "оборачиваний" не происходит, потому что за 1 шаг ты получаешь запредельные скорости, и частицы с запредельными скоростями после итерации находятся очень далеко, гравитация уже ничего не сможет сделать. Поэтому нужно уменьшать шаг интегрирования.

Great V.
> В природе такого нет.
В природе такого нет, потому что там шаг интегрирования равен планковскому времени, а точность float-a не ограничена. :)

#10
18:41, 8 дек. 2019

=A=L=X=
> Полноценная физика нефизична?
Нет. Я считаю что нефизично само поведение типа "если произошло столкновение то делаем что-то".
Я как раз допускаю что возможно есть смысл ввести силу отталкивания, но с константой меньшей чем G. В таком случае физика будет описываться двумя силами с неограниченным радиусом действия, но с разными константами.
Правда это не устраняет бесконечности, так что мимо.

> Ибо судя по тому что я понял должно эмулироваться какое то облако нелипнущих
> частиц
Да, типа того:

+ Показать

но условие:
> не слипшийся комок невесть чего
не обязательно должно выполнятся. Главное чтобы частицы при взаимодействии не улетали в бесконечность.

#11
18:55, 8 дек. 2019

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

#12
8:31, 9 дек. 2019

Great V.
> Я что-то не улавливаю смысл этой формулы

Ну через d вот так выглядит: (d * d + С) / (d + 1)
Это величина, подставляемая вместо расстояния d. При d гораздо больше C и единицы она практически равна d, а при d в районе нуля она стремится к C. То есть С - это такой порог, ниже которого эта величина не сможет опуститься.

Great V.
> Можешь расписать ее полностью

d' = (d * d + С) / (d + 1)
F = G * m1 * m2 / (d' * d')

То есть, при d гораздо больше C и единицы формула гравитации будет давать практически такую же величину, но никогда не сможет стать бесконечностью/очень большой, т.к. делиться будет минимум на C в квадрате, а не на 0.

#13
21:23, 9 дек. 2019

Great V.
> Правда тут появляется другой косяк: как уместить все это в пример для новичков
> и есть ли в этом вообще смысл.
Смысла точно нет менять физику, и делать какое-то там отталкивание.
А как сделать - я же уже сказал, priority queue + функция оценки разницы в ускорениях на текущем шаге и предыдущем. По факту код получается досататочно простой.

#14
21:44, 9 дек. 2019

Great V.
> я пилю коротенькие курсы графики

Нахрена для курсов по графике такие замуты? вы же графике учить взялись а не физике.

> Не физически корректно.

Любое численное интегрирование несет проблемы: закон сохранения энергии будет нарушаться тем больше чем дольше интегрируете, закон сохранения импульса тоже.

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

Почему бы просто не взять готовое двигло аля Bullet? Заодно покажите как интегрировать свою ламповую графику с чем то сторонним.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумФизика