Comments 21
спасибо за статью, в метод Верле или Рунге-Кутты можно попасть переделав расчет физики на positionBased физику ) читал в одной из статей в интернете )
но я пока так и не дошел в 3д до неё ) слишком сложная тема покачто, физика это же система отношений обьектов )
если бы солвер можно было бы повесить на лямбда замыкаловку поидее вроде можно подумать что как ) или через бинды(functional)
Ради эксперимента попробуйте построить график энергии системы со временем - он может неприятно удивить.
Ещё, если вы запустите свои расчёты в обратном направлении по времени, то тела не будут в исходные координаты приходить. Для того, что бы это обходить, нужно "leapfrog"-подход для рассчёта сил использовать, подробнее тут, 2.8.
Последний раз, когда я изучал вопрос - наилучшим способом численного решения задачи N>>1 тел был gyrfalcON. Это такое интересное решение, которое а) легко работает для миллионов и десятков миллионов объектов б) считает каждый шаг за O(N)
(не `O(N logN)` !) и в) ещё и энергию сохраняет при длительном моделировании.
Тот кто нас моделирует тоже что-то наоптимизировал, а у нас потом спутники замедляются (см. Эффект «Пионера»).
А что насчёт проблемы быстрых пролетов частиц друг рядом с другом?
В ньютоновской модели быстрые пролёты частиц описываются приближённо и могут давать неточные результаты — она не учитывает конечную скорость распространения гравитации и релятивистские эффекты. Для точного анализа таких ситуаций лучше использовать общую теорию относительности.
Нет, теория относительности тут ни при чем. Проблема в том, что время в симуляции квантовано. например, две массы сближаются, и расстояние между ними на каждом кванте симуляции:
5.0
4.0
2.8
1.6
0.0001
На практике частицы при таком близком пролете разлетаются (возможно в других направлениях), но с сохранением энергии. В нашей симуляции r квадрат стоит в знаменателе, поэтому в частицы получат чудовищные скорости. Общая энергия систем растет в таких симуляциях (что является оценкой неточности симуляции)
"которое заставляет любые два объекта, обладающие массой, притягиваться друг к другу" и каким образом тогда безмассовый фотон изменяет свою траекторию пролетая возле массивного тела (эффект линзирования)?
В статье модель Ньютона. Фотон, как безмассовая частица, действительно не взаимодействует с гравитацией в ньютоновском смысле. Его отклонение объясняется только в рамках общей теории относительности, где гравитация трактуется как искривление пространства-времени, и свет движется по геодезическим линиям в этом искривлённом пространстве.
Лет 15+ назад, я плохо помню, но тут была статья с расчетами Солнечной системы на миллионы лет вперед. Вроде, жуткая нестабильность: изменение начальных условий на сантиметры приводило к столкновению то одних планет, то других... Кажется, автор потом в Америку уехал, но это совсем о другом.
Да-да, не только Земля притягивает яблоко, но и яблоко (пусть и очень-очень слабо) притягивает Землю!
А разве не одинаково?
Одинаково. Речь видимо о перемещении, вызванным этими притяжениями.
Ничто никуда не притягивается, не существует никаких сил притяжения, Ньютон ошибался. Иначе бы безмассовый фотон не менял свою траекторию пролетая возле массивного тела.
Спасибо за статью, я делал симуляцию гравитации на JavaScript и уперся в потолок производительности для больших систем из-за квадратичного алгоритма. В итоге пришёл к похожему решению, что надо разбить пространство на ячейки с общим центром масс, и считать гравитацию до непустых ячеек, но так и не реализовал.
А интересно, а на каком количестве уперлись в потолок?
У меня была симуляция 60 кадров в секунду, и при количестве объектов около 1500 она начинала лагать, что составляло примерно 1500*1500*60 = 135 000 000 операций вычисления гравитационного взаимодействия в секунду. Зато для маленьких систем, типо планет вращающихся вокруг звезды, на один фрейм можно было делать десятки и сотни тиков симуляции с небольшим deltaT и наблюдать за развитием системы в перемотке.
N - количество объектов (1500), по вашей формуле, всего взаимодействий, получается N^2 т.е. квадрат N, НО...
Если у нас N объектов, то первый объект взаимодействует с (N-1) оставшимися. Второй объект также взаимодействует с (N-1) другими (включая первый, с которым взаимодействие уже учтено, если мы считаем направленно).
Если мы просто умножим N на (N-1), то получим N*(N-1) взаимодействий. Но при этом мы посчитаем взаимодействие между объектом A и объектом B, а затем взаимодействие между объектом B и объектом A как два разных. Однако по третьему закону Ньютона сила (которой на самом деле не существует, Ньютон ошибался, ничто никуда не падает, ничто ни к чему не притягивается), с которой A действует на B, равна по модулю и противоположна по направлению силе, с которой B действует на A. Это одно и то же взаимодействие. Поэтому, чтобы получить количество уникальных пар взаимодействий, мы делим результат на 2:
N*(N-1)/2
т.е. в вашем случае это не 135 000 000, а 67 455 000.
Я описал сложность моего кода, а не оптимизированной реализации которую вы описали, и в моём случае будет N*(N-1). Да можно оптимизировать, и будет тогда предел не 1500, а допустим 2000, что не чувствуется большой разницей. Я привел число только чтобы показать, что оно стремиться к порядку миллиарда операций, который можно выжать на одном ядре процессора, и если посчитать число атомарных операций то примерно так и будет.
Гравитация: Пишем симулятор на Python