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

Физика «на пальцах»: Position-Based подход (комментарии) (13 стр)

Страницы: 18 9 10 11 12 13
#180
0:52, 20 апр. 2013

bagnis
> Ее отклонение от настоящей - пропорционально квадрату шага интегрирования. Но
> мне все равно. Я ещё раз считаю ту же орбиту с другим шагом. Строю график
> зависимости радиуса орбиты от шага. И получаю истинную орбиту при шаге ноль.
проблема в том, что в общем случае ошибка будет порядка квадрата шага, но в какую сторону и на какую конкретно величину - неизвестно. это всего лишь оценка ошибки, а не её точная величина. чем больше будет произведено численных расчётов, тем с большей точностью можно будет оценить точное значение искомого параметра, но сказать его точную величину в общем случае нельзя никогда.

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

> 6-7 порядок для молекулярной динамики - прошу ссылочку
http://en.wikipedia.org/wiki/Dormand–Prince_method - прекрасно подходит для уравнений молекулярной динамики.

#181
1:56, 20 апр. 2013

Да вариаций рунге кута - полно. Просто почти ничего не используется, кроме leap frog. И причин множество, одна из них - простота метода. Вторая причина - никто не использует точные взаимодействия и обычно обрезают количество взаимодействующих частиц. Типа, радиус взаимодействия. Третье, связано с тем, что leap frog, оказывается, может записываться, как эффективный термостат и не нарушает из-за этого кучу полезных распределений (честно говоря, я эту тему уже не помню). Поэтому молекулярщики просто обожают leap frog и его вариации.
Я уже не знаю, как пояснить, что такое шкалирование. Кстати, 90% молекулярщиков не знакомы с этим, так что от геймдевов нельзя ожидать знаний на эту тему. ) Я лично узнал эту тему от симуляторщиков бозе частиц. Они симулируют малое количество частиц, но им нужны всегда очень высокие точности симуляций.
Ещё раз поясняю. (С этого момента читать вдумчиво!)
Никто не знает истинной измеряемой величины. Допустим это энергия, или радиус орбиты whatever. Но мы знаем шаг интегрирования. И вот мы померяли енергию E(dt^2) это функция квадрата шага интегрирования. Отлично. Меняем шаг, допустим уменьшаем в 2 раза. Меряем ещё раз E((2dt)^2). Строим график (в нашем случае это прямая) E от dt^2. Эта прямая пересекает ось X. И вот точка пересечения и есть E(0) - абсолютно точное значение энергии. ) ТО которое бы получилось, если бы провели симуляцию с нулевым шагом. )
Фух... Третий раз пояснять не буду, так что - кто не понял, что такое шкалирование - я не виноват! )

#182
2:47, 20 апр. 2013

bagnis
последний раз попытаюсь объяснить. если ошибка порядка квадрата dt, это означает, что она будет ограничена величиной порядка alpha*dt^2. она не будет равна alpha*dt^2, она будет ей ограничена. то есть может быть -alpha*dt^2, может быть +alpha*dt^2. может быть 0. так вот если сделать серию расчётов с разными шагами по времени, то они лягут не на прямую вовсе, а область, ограниченную двумя параболами и проведя прямую через какие-либо два расчёта, можно лишь аппроксимировать точное значение при устремлённом к нулю шаге с некоторой точностью. и чем выше порядок точности метода, тем точнее будет эта аппроксимация, наивно полагать, что ваш любимый leapfrog действительно здесь имеет какое-то преимущество. да, просто. да, вычислительно эффективно. но точность? извольте. то, что вы называете шкалированием(что вообще-то называется экстраполяцией результата) панацеей вовсе не является, так как точного ответа в общем случае, разумеется, не даёт.

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

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

#183
3:36, 20 апр. 2013

Гы.. Не надо мне тыкать. ) И иносказательно про меня говорить типа такой расчетчик с горе солвером - тоже не надо. ) Я 4-ре года отработал в Голланд в Твенте в группе проф. Брилса.
Жаль, что вы не поняли про масштабирование. Наверное, я плохо поясняю.
Но возьмите какую-нить задачу, все равно какую - движение спутника. Просимулируйте один оборот спутника с разными шагами. Возьмите получившиеся орбиты, радиусы. Радиус системы посчитанного с интервалом один, с интервалом два и т.д. Постройте функцию зависимости радиусов от квадрата шага. Она будет ГЛАДКОЙ. Никаких туда сюда прыганий. И вот пересечение этой функции с осью Х - достоверно дает истинный радиус. Люди для этого и симулируют свои системы с разными шагами.
Чтобы легло между двух кривых - нужно симулировать не только разные шаги, но и разные системы. А одна и та же система при разных шагах будет точнехонько ложиться на плавную кривую.
И, кстати, на сколько я помню (хотя може и забыл) энергия ложиться не на параболу, а на прямую от dt^2. Но если перевести на dt - будет парабола, ессно.)
Ладно, все... Тема зациклилась я больше в этом цикле не участвую. )

#184
3:59, 20 апр. 2013

https://ps.vk.me/c521107/u1911035/doc/ad6d8560fce8/fallinchain.gif
Один из примеров моей симуляции.
Свободно сочлененная цепь из 100 звеньев подвязана к потолку, в начальный момент времени хвост ее отпускается (второй конец привязан к потолку), ну и она разматывается и начинает прыгать.
Тут все и holonomic constraints и leap frog и sparse методы и LU декомпозиция и нелинейные координаты. )) И главное, что все сработало. Цепь - почти настоящая. Все сохраняется, энергии, импульсы, моменты. Но нет взаимодействий с самопересечением (узел она с собой не завяжет). Бо на таком уровне задача с узлами - очень тяжкая. Хотя можно, как-то сделать.... Если будет настрой. ))

#185
4:03, 20 апр. 2013

bagnis
> Я 4-ре года отработал в Голланд в Твенте в группе проф. Брилса.
ничего страшного. профессиональные знания с возрастом отходят(если они были), зато появляется жизненный опыт.

> Она будет ГЛАДКОЙ.
ах! надо же. только что была
> (в нашем случае это прямая)
а теперь уже просто гладкая функция! ничего себе. а теперь если немного поразмыслить, то будет ясно, что гладкой она если и будет, то лишь в некотором интервале. и положение какой-нибудь конкретной молекулы с системе из пары миллионов таких молекул будет иметь гладкую зависимость от шага лишь в ничтожно малом интервале и продолжить её, дабы получить аналитическое значение, будет практически невозможно. а чтобы посчитать радиус спутника на орбите, достаточно взять метод на порядок выше точности и получить более точное решение без экстраполяции и пересчёта, которые вовсе не всегда возможны.


> И, кстати, на сколько я помню (хотя може и забыл) энергия ложиться не на параболу, а на прямую от dt^2. Но если перевести на dt - будет парабола, ессно.)
> на сколько
> ложиться
закрывая глаза на грамматику, видимо, подзабытую за четыре года в голландии, замечу лишь, что если от оси dt перейти к dt^2, то результаты опять же лягут не на прямую как тебе бы хотелось, и даже не на гладкую кривую, а они попадут в конус вида +-alpha*x. снова да на ты обратился? вот гад.

> Свободно сочлененная цепь из 100 звеньев подвязана к потолку
100 звеньев - это не серьёзно. такую цепь можно и аналитически решить за n^3, составив лагранжиан системы и точно решив уравнения на все связи.

Прошло более 3 лет
#186
23:43, 29 сен. 2016

Пытаюсь сделать упругое столкновение боксов с помощью кода из статьи, но столкнулся с проблоемой:
1) Пусть ящики имеют равную массу, один покоится, а второй сталкивается с ним имея скорость = 1.
2) После расталкивания этим кодом
particles[ i ].Push(-penetrationDirection * penetrationDepth * 0.5f);
particles[ j ].Push(  penetrationDirection * penetrationDepth * 0.5f);
Скорости ящиков становятся 0.5 и 0.5. Они вместе летят в одну сторону.
3) Теперь условие if(exchangeVelocity > 0) не выполняется и никаких дальнейших обменов импульсами нет.
Поведение соответствует неупругому столкновению. Как добиться упругого столкновения?

#187
2:20, 30 сен. 2016

Parfen Rogozhin
> Пытаюсь сделать упругое столкновение боксов с помощью кода из статьи, но
> столкнулся с проблоемой:
именно в этом и есть основной недостаток метода — он не позволяет точно контролировать потери энергии при соударениях, гарантируя лишь, что энергия не будет возрастать. это вполне хорошо работает для систем, где каждое отдельное соударение не играет особой роли, и где важно поведение системы в целом. например, при моделировании сыпучих материалов, систем частиц. если хочется, чтобы энергия при соударении менялась контролируемым образом, необходимо расталкивать тела, меняя prevPos и pos, а потом пересчитать prevPos таким образом, чтобы энергии потерялось столько, сколько нужно (по сути выполнив ту же самую математику, что и при моделировании импульсной физики). поэтому я сразу и говорил, что если нужна точная физика, то имеет смысл использовать импульсы, потому что попытки добиться контролируемых потерь энергии в position-based убивают всю его простоту.

#188
8:42, 30 сен. 2016

Suslik
> поэтому я сразу и говорил, что если нужна точная физика, то имеет смысл использовать импульсы, потому что попытки добиться контролируемых потерь энергии в position-based убивают всю его простоту.
Понял, но я и не думал что все на столько печально :( Значит буду пилить импульсы.

#189
9:17, 30 сен. 2016

Parfen Rogozhin
Я поверх position-based писал логику обычной импульсной физики. По сути, ты напишешь ту же импульсную физику. Единственный забавный плюс в том, что обычные партиклы можно продолжать сталкивать с гранями (телами) как раньше (например в статье о физике Hitman), т.е. ищем ближайщую грань, выталкиваем из неё партикл и оба партикла грани пропорционально. И всё это весело взаимодействует. На правильность не претендует, но мягкие тела, верёвки, обычные партиклы и вот эта читерная импульсная физика выглядели в куче не плохо.
Хотя, если разобраться, то что-то там таки верно, когда реализовывал прыжки (нужно было посчитать скорость, которую нужно установить телу, чтобы оно полетело в нужную точку из данной по дуге), обычные формулы работали для меня верно (с поправкой на position-based).

#190
10:44, 30 сен. 2016

belK@
я в своей магистерской обосновывал корректность position-based подхода. наверняка это кто-то делал до меня, и я изобрёл велосипед, но итерационная схема решения упругих связей полунеявным методом эйлера при максимальной жёсткости, при которой схема продолжает быть устойчивой для фиксирвоанного шага времени, оказывается математически эквивалентной простому position-based расталкиванию. что характерно, при меньших 1.0 значениях жёсткости position-based связей их физический смысл теряется, так как жёсткость становится фактически зависимой от шага по времени и position-based схема по сути при этом теряет свойство сходимости к точному решению. короче для значений жёсткости связей = 1.0f, position-based явлется вполне математически корректной схемой для аппроксимации бесконечно жёстких связей. чтобы хоть как-то моделировать не совсем жёсткие связи, достаточно выбрать коэф.жёсткости меньше 1.0f, но чтобы это делать корректно, схему нужно немного переформулировать.

#191
11:14, 30 сен. 2016

Suslik
> но итерационная схема решения упругих связей полунеявным методом эйлера при
> максимальной жёсткости, при которой схема продолжает быть устойчивой для
> фиксирвоанного шага времени, оказывается математически эквивалентной простому
> position-based расталкиванию
Изображение

Страницы: 18 9 10 11 12 13
ПрограммированиеФорумФизика

Тема в архиве.