Comments
Лучше переведите Rigid Body Dynamics motion with constraints, там больше интересного. И метод решения уравнений для статического равновесия. Еще есть интересные статьи как эта математика распараллеливается на gpu.
По поиску нашёл только мастер тезис Michael Bradley Cline 1999 года на 111 страниц. Вы же не его мне предлагаете переводить, правда? Поиск статьи слово в слово ничего не дал, если не сложно киньте ссылку пожалуйста.
Спасибо большое за ссылки, я не понял сразу что вы на материалы курса ссылались. Да, курс на первый взгляд очень интересный у них. Надо бы выжимку на досуге сделать.

Реально Круто! Всегда мечтал о таком!


А реализация через OpenCL или CUDA будет?

Да тут же простенькие симуляции, и четверти ядра хватит :)
Нет, всё же это из-за погрешности при численном интегрировании.
Разумеется из-за погрешностей. Метод Эйлера (тем более явный) — решение «в лоб». Для более точного решения стоит использовать хотя бы leap-frog (вычисляем попеременно то координату, то скорость). Будет и энергия сохраняться, и орбита.

А «большие дяди» используют хотя бы метод Рунге-Кутты 4 порядка. Пишется в 4 строчки, а погрешность — O(h^2).
Вот за этим я всегда прихожу в комменты, за leap-frog первый раз слышу, хотя написал немало методов. Он очевиден и легко «изобретается», но не знал про его свойства.
Рунге-Кутты 4 порядка всё же имеет 4-й порядок сходимости, соответственно O(h^4). Может вы имели в виду Рунге-Кутты 2-го порядка? Он действительно в 4 строчки.
Да, разумеется, О(h^4). Второпях набирал =)

Если еще хотите поэкспериментировать с N-body, гуглите в сторону метода потенциалов: вычисляем не силу, действующую на каждое тело, а потенциал (например, гравитационный) в нужной точке. С него потом можно переходить на Practical Mesh и Tree-Code
Тоже хотел про это написать и даже был готов возмущаться, как так можно было написать. А потом подумал, как сделать симуляцию устойчивую к этой проблеме. Не поднять точность, а принципиально избавить метод от подобных ошибок. Конкретно эту задачу решить несложно — задача двух тел решается аналитически. А как быть с тремя телами? Пока могу придумать только количественные решения, например, методы высоких порядков сходимости (Р-К 4).
Консервативные схемы интегрирования нужны. Короче насильно закон сохранения энергии и импульса поддерживать.
Задача трех тел аналитически не решается (строго говоря, нашелся один финн, который смог ее решить при помощи ну уж ооооочень медленно сходящихся рядов, так что это практического смысла не имеет).

Чуть выше уже написал, что можно делать в случае, когда тел не меньше трех.
Касаемо симуляции прыгающего мячика. Когда-то я моделировал движение турбины, которая могла соприкасаться со статором и изучал хаотические колебания ротора. Модель соударения я моделировал в приближении Герца, то есть в момент удара действует упругая сила. В этом случае, если использовать метод Адамса для решение ОДУ, то решение получается довольно гладким. Вообще для таких задач надо тщательно выбирать метод численного решения.
Когда писал себе симулятор гравитации обнаружил, что при сближении объектов (столкновение, а не движение по стабильной орбите) все идет в тартары. А именно: объекты после столкновения разлетаются с сильно увеличенной скоростью и нарушением закона сохранения энергии. Ваша реализация точно также ведет себя, если обнулить скорость Луны.
Есть какие-то способы это обойти?
А как столкновение обрабатывали? Если это было именно столкновение, то уже 100 раз написано в множестве физдвижков и куча статей про это.
Если же вы не обрабатывали это отдельно, а это был пролёт очень близко к центру масс, то всё ещё проще. Скорости около центров огромные, а влияние малейших изменений расстояния очень велико, поэтому любые погрешности (как метода, так и вычислительные) резко усиливаются. Выше писали про leap-frog, он не даст супер точности, но с энергией должно быть хорошо.
Столкновение никак не обрабатывалось. Строго говоря я не хотел бы вообще их обрабатывать до того момента как пойму, что моя модель корректно работает на гравитации. Про корректность: я ожидал что два идеальных шарика в вакууме (изначально с нулевой скоростью) будут бесконечно мотыляться вдоль одного ограниченного отрезка. За leapfrog посмотрю как оно себя ведет, спасибо.
Уточнение: под столкновением в оригинальном комментарии я подразумевал такое сближение объектов, что их координаты при максимально точных рассчетах должны были рано или поздно совпасть. Самого столкновения не было
leap-frog поможет на больших расстояниях, Луна перестанет стабильно удаляться. В вашем случае этого может не хватить, потому что рядом с нолём сила уходит в бесконечность и правильно проинтегрировать вряд ли получится. Методы более высоких порядков дадут выше точность, но всё равно ничего не гарантируют. Метод потенциалов, выше, осилит подобное.
Но скорее всего в вашей задаче не нужна эта безумная точность в окрестности ноля, для небесной механики достаточно ограничить расстояние радиусом планет. При сближении на такое расстояние посчитать соударение шариков (неупругих с потерями на нагрев).
По глупости изначально решил, что метод потенциалов не поможет, но сейчас понял что был не прав. Спасибо.
А вот касательно безумной точности вы не совсем правы. Когда клацал по чужим симуляторам (которые «решали» эту проблему через соударение) в некоторых случаях добивался точно такого же нарушения. Либо их писали раки, либо это частичное решение проблемы.
Но у меня задача была по моделированию разных вариантов гравитации для собственного любопытства. Тут именно максимальная точность нужна.
Либо их писали раки

Как бы грубо не звучало, но скорее всего так. В физдвиижках давно научились правильно обрабатывать столкновения. Это же два бильярдных шара, там всё банально считается в лоб. Вывести формулы скоростей после соударения, да тут первокурсник справится! Главное правильно отследить момент удара, а не давать погружаться телам друг в друга за один кадр.
Для любопытства это здорово, но планета — не материальная точка, у неё размер есть. Взаимодействия на сравнимых с размером дистанциях уже интереснее. Материальной точке пофиг, а протяжённые объекты получат приливной градиент. Внутри планеты тоже всё будет не так. Ровно в центре гравитация вообще 0, а не бесконечность как в формуле G*M/R^2.
Моя мысль в том, что малые расстояния находятся за пределами применимости формул небесной механики, не надо пытаться добиваться точности от них.
Видимо, происходит абсолютно упругое столкновение, т. е. не учитывается переход энергии движения в деформацию / разрушение / нагрев. Надо особо это обрабатывать. Даже мячик в симуляции выше не должен бы прыгать вечно.

Автор очень так нехило замахнулся, я погляжу


Симуляцию, будь это дождь, поток воздуха над крылом самолёта или же падающий по ступенькам слинки

Два из трёх по обозначенной методике моделировать — прямо скажем идея так себе. Дождь вменяемо моделировать только стохастическим процессом, там сплошная теория вероятностей, ибо считать динамику миллиардов капель — занятие для бессмертных. Поток воздуха над крылом самолёта это уравнения Навье-Стокса, которые вообще-то в частных производных и требуют решения смешанной (начально-краевой) задачи, а не задачи Коши. Пружинка — ещё туда-сюда, но по-хорошему там тоже частные производные по пространству вылезают.


Схема численного интегрирования тоже выбрана не самая удачная, даже для задачи Коши. Хоть бы в общем виде была разностная схема, а не просто метод Эйлера. Ну и решать большие сильно-обусловленные задачи с высшими производными (которых на практике большинство) в явном виде без контроля погрешности это конечно для больших ценителей, обычно-то берется что-нибудь квазиньютоновское с переменным шагом типа CVODE.


В общем какая-то странная статья. Во введении замах на "как численно моделировать всё", а внутри "численное моделирование ньютоновской динамики для самых маленьких". Напоминает студенческий реферат чем-то.

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

Если оно "как рекламный плакат", то это называется false advertising, по-русски "ненадлежащая реклама" (в данном случае недостоверная), нет? Вот я например залез в надежде на универсальный подход, про который может быть чего-то не знаю, а нашёл… ну в общем разочарование. Претензия, безусловно, не к Вам.


Для общего представления моделирования

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


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


На правах "выкрика из зала", может, чтобы не получался пересказ Маршака и Пастернака, действительно, взять непосредственно SIGGRAPH'овские конспекты вместо блога "по мотивам"? Подача материала конечно суховата, да и много там букв, но ценность статей кажется больше получится. Вот кстати материалы за 2001-й год, который Pixar никуда вроде не удалил.

Если оно «как рекламный плакат», то это называется false advertising, по-русски «ненадлежащая реклама» (в данном случае недостоверная), нет?
Возможно, с натяжкой, но в защиту автора скажу, что в начале он ничего конкретного не обещал, только лишь указал на общую модель. У этой статьи, как и у других есть целевая аудитория, не все же помнят или даже проходили численные методы с дифурами. А такая подача как раз и направлена на то, чтобы заинтересовать аудиторию этими темами. И извинюсь за автора, если Ваши ожидания не оправдались :)

А за ссылку спасибо. Видимо перенесли материалы курса к себе на страницу. Обязательно передам автору.

Only those users with full accounts are able to leave comments. Log in, please.