Решил подготовить своим студентам лабу по сабжу статьи. И, блин, сделал окрытие! Преамбула:
Часто встречал на форуме мнение, что при интегрировании позиции точки лучше учитывать член с ускорением, то есть так:
pos += velocity * dt + acceleration * dt * dt * 0.5f;
velocity += acceleration * dt;Ну и аргументируется это тем, что хоть скорость и будет считаться с первым порядком точности как и раньше, но позиция будет считаться со вторым. Тем не менее опыт почему-то говорил, что если сделать так:
velocity += acceleration * dt pos += velocity * dt
то при постоянном dt получается ну просто зашибись. В общем путём нехитрых преобразований выяснил, что такая формула и является перефразированным position-based, то есть обладает третьим порядком точности. Успех же, желающие могут проверить у себя в проекте, выкинув лишний член и поменяв две строчки местами, на халяву получив +1 к порядку точности.
Ну и плюс по мелочи пофиксил старенькую статью, добавил матан под спойлеры для желающих разобраться в математической стороне происходящего.
Suslik
> В общем путём нехитрых преобразований выяснил, что такая формула и является
> перефразированным position-based, то есть обладает третьим порядком точности.
> Успех же, желающие могут проверить у себя в проекте, выкинув лишний член и
> поменяв две строчки местами, на халяву получив +1 к порядку точности.
Спасибо, что написал об этом, а то я думал, что у меня одни читы да хаки в физике, а оказалось не совсем :)
Выводить формулы не люблю, использовал второе поскольку нравилось как работает да выглядит довольно логично, а тут вот оно что оказалось.
Люди открыли для себя верлет лист
v(dt/2)=v(-dt/2)+a(t)*dt
r(dt)=r(0)+v(dt/2)*dt
Которому уже лет 30. ))) Есть и более крутые алгоритмы интегрирования по траекториям. С аккамулэйшн еррор dt^2
А чтоб учитывать связи и сохранялась энергия - нужно пользоваться алгоритмами SHAKE или RATTLE. А не изобретать собственные нативные методы. )
bagnis
> А чтоб учитывать связи и сохранялась энергия - нужно пользоваться алгоритмами SHAKE или RATTLE. А не изобретать собственные нативные методы. )
да ради бога. написать адаптивного дорманда-принса седьмого порядка по времени - десяток строчек кода. фишка в том, что position-based позволяет не хранить никаких дополнительных данных - только позиция, скорость(или предыдущая позиция) и ускорение.
SHAKE - алгоритм, который использует gauss-seidel'я для решения связей. метод с итеративной релаксацией бинарных связей, описанный в статье, математически эквивалентен gauss-seidel'ю.
RATTLE(из википедии) - RATTLE works the same way as SHAKE,[17] yet using the Velocity Verlet time integration scheme. (без комментариев)
Проще говоря, зачем усложнять себе жизнь? Если нужно супер точно, то есть профит от более сложных и точных методов.
Но, если нужна физика для казуалки, то зачем мне там SHAKE, если я могу сделать всё гораздо проще и 90% народу вообще разницы не заметит.
belK@
> Но, если нужна физика для казуалки, то зачем мне там SHAKE
прочитай сообщение выше. SHAKE - это и есть то, что описано в статье, только с интегратором эйлера. RATTLE - буквально то, что описано в статье. просто они очень любят называть старые методы новыми именами.
Так верлет лист и хранит тока позицию и скорость смещенные относительно друг друга на полшага. Написана ж формула. )
Между SHAKE и RATTLE, канешн, формально разница в ту самую одну строчку "yet using the Velocity Verlet time integration scheme" на деле означает то, что SHAKE включается после update координат, а RATTLE после update скоростей. Исходят из текущей потребности. Обычно людям нужны координаты. А методы SHAKE очень обширны. И динамические связи этими методами тоже считают. ) По моему мнению - самый крутой алгоритм по учету связей. Быстрый, точный. )
Кстати, так как я один из разработчиков методов SHAKE (по динамическим связям), можете задавать мИне любые вопросы, на которые я смогу ответить. ))
И ещё, кстати, самое распространненое название для схемы интегрирования со смещенными относительно друг друга на полшага скоростью и координатами - leap frog. Ценность его дополнительно в том, что им хорошо интегрировать циклические траектории, например, вращение спутника методом Эйлера даст траекторию - спираль. Спутник уйдет с траектории. А leap frog даст круговую орбиту (немножко, правда, отличающуюся от настоящей). )))
bagnis
> И ещё, кстати, самое распространненое название для схемы интегрирования со смещенными относительно друг друга на полшага скоростью и координатами - leap frog
это тот же самый верле, только переформулированный. то есть все эти схемы математически эквивалентны. то, что они на халяву повышают порядок точности - конечно, здорово, но больше чем третий порядок с ними получить не удастся, так что в нериалтайм методах всё-таки предпочтительнее более точные рунге-кутты.
Suslik
> в нериалтайм методах всё-таки предпочтительнее более точные рунге-кутты.
Кстати, не всегда. Когда в задаче всякие разрывные коэффициенты и прочий жесткач, более простые схемы ведут себя гораздо лучше. Вот для гладеньких задач высокий порядок рулит.
Не совсем предпочтительные более точные методы. ПОпытаюсь пояснить. Мы знаем, что leap frog нам даст ошибку dt^2 и это замечательно. ) Это означает, что результаты шкалируются. Если мы знаем, как шкалируется, мы это используем, например, шкалируется ошибка энергии пропорционально dt^2. Мы делаем несколько измерений для разных dt и строим график, и этот график зависимости от dt^2 - прямая. Там де она пересекается с линией dt = 0, там и истинное значение энергии. )) Настоящее. Ваще без всяких ошибок.
Вот такая херня, малята. ))
Вот поэтому 99.9% всех симуляций в молекулярной физике - leap frog.
bagnis
чтобы энергию вычислить, можно вообще ничего не "симулировать"(для справки это слово в русском языке обозначает вовсе не то, что тебе бы хотелось) - её обычно можно просто вычислить аналитически. а более сложную величину вроде фазовых координат таким способом вычислить не удастся.
> Вот поэтому у нас 99.9% всех симуляций в молекулярной физике - leap frog.
fxd, не благодари.
у нас молекулярную динамику считают адаптивными схемами с 6-7 порядком по времени. именно потому что задача гладкая и нет никаких разрывных коэффициентов. отсюда для достижения той же точности можно взять больший шаг по времени, чем при счёте схемой с низким порядком аппроксимации.
Ну, не всегда можно вычислить что-то аналитически. Иначе бы не было смысла в молекулярной динамике. Люди запускают там ансамбль из многих частиц и затем меряют энергию системы, как сумму энергий каждой частицы. Кинетическая, например, дает температуру. Про точность я уже сказал. Если задача шкалируется, то все равно чем считать. Можно отшкалировав, найти точные динамические параметры.
Могу на пальцах. Допустим я методом leap frog посчитал орбиту. Эта орбита не точная. Ее отклонение от настоящей - пропорционально квадрату шага интегрирования. Но мне все равно. Я ещё раз считаю ту же орбиту с другим шагом. Строю график зависимости радиуса орбиты от шага. И получаю истинную орбиту при шаге ноль.
6-7 порядок для молекулярной динамики - прошу ссылочку. DL POLY, GROMAX или какие известные пакеты используют 6-7 порядок? ) Я за все годы ни разу не сталкивался с таким. )
Какая-то тенденция скатывания темы в троллинг. )
Тема в архиве.