Обновить

Комментарии 12

А ещё можно добавть потенциал Ван-дер-Ваальса и наблюдать фазовые переходы и формирование кристалов.

Можно, это будет аналог гравитации, только направление в сторону другого атома. Но тут есть такой нюанс, что на границе возникает потеря импульса. То есть при переходе из точки где потенциал 0 в точку где уже не 0 скорость меняется на одну величину, а в обратную сторону немного на другую. Если рассмотреть 2 атома, которые постоянно притягиваются по горизонтали и разлетаются после столкновения туда-сюда, то постепенно амплитуда уменьшается. Уменьшение кванта времени помогает, но не убирает проблему полностью. У меня не получилось найти способ считать точно. Наверно тут тоже надо вводить квантование каким-то способом.

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

Насколько я понял, в методе Эйлера сначала рассчитывается новая скорость. Я так и делал. Может где-то расчеты были не совсем правильные. Там еще дело в том, что если сделать электростатическое притяжение между атомами и сбрасывать скорость до нуля несколько раз, то формируется структура, похожая на каплю жидкости, но она двигается по экрану туда-сюда с рандомной скоростью, то быстрее то медленнее. Поэтому я не стал включать это в статью.

А почему при столкновении нескольких объектов нельзя их обрабатывать попарно? Просто считать, что одна пара столкнулась на епсилон микросекунд раньше других? Ведь в пределе должно получиться тоже самое.

Надо только не двигать атомы, пока все столкновения не разрешатся.

С приведенным кодом оно так и получается. Просто шарики двигаются не так, как в бильярде, что может выглядеть неожиданно. Если один ударяет сразу 2, они получают разные импульсы. Примерно так.

Странно, я думал, что там в итоге должны те же скорости получатся. Но оказывается нет.

И вообще задача одновременного столкновения нескольких тел неразрешима. Там надо найти N импульсов, а у нас всего 2 уравнения: сохранение энергии и импульса.

И проблема в том, что при попарных столкновениях мы считаем что импульс сохраняется в паре, но при троичном столкновении импульсом обмениваются все три тела сразу, поэтому применять формулы для двух тел нельзя.

Если рассчитывать столкновения по очереди, то основной импульс двигающегося объекта уйдет в первое столкновение с неподвижным. Поэтому получаются разные скорости.

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

Есть же физические движки (все перечислять не буду, например, pybullet), зачем изобретать велосипед?

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

я на них много чего сделал, но конкретно такую страницу мне не надо

Ну так вопрос-то вы задали мне) Вот и ответ, на них такую страницу сделать нельзя, или как минимум это будет сильно сложнее.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации