Состояние системы NNN-тело через время ttt (упругое столкновение и отсутствие гравитации)

Я создаю игру на основе симулятора газовых частиц. Все узлы (зеленые кружки) представляют газообразные частицы и упруго сталкиваются.

Мой алгоритм правильно учитывает столкновения двух частиц, так как конечная скорость рассчитывается путем непосредственного применения уравнения. Однако это не удается, если три или более частиц перекрываются (сталкиваются) в один и тот же такт (кадр).

Мой вопрос заключается в том, как я могу рассчитать конечные скорости столкновения с более чем двумя сталкивающимися частицами. Обратите внимание, что если A сталкивается с B, а B сталкивается с C, A не обязательно сталкивается с C (B может быть в центре).

Есть ли алгоритм, разработанный специально для этого?

Симулятор: https://gravitifydemo1.github.io/

Импульс неверный (на момент написания). Однако график KE меняет свое значение. Если бы алгоритм двухчастичных столкновений работал правильно, КЕ не изменился бы. График постоянен в течение большей части времени, но он движется вверх и вниз.

Ответы (1)

Одним из частичных решений было бы использование адаптивных временных шагов, т. е. когда вы обнаруживаете несколько столкновений с одной и той же частицей за раз. т + Δ т , ваш шаг по времени уменьшается, так что с этой частицей происходит только одно столкновение, т. е. вы вычисляете положения в т + ϵ Δ т , с 0 < ϵ < 1 .

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


Редактировать: Что касается множественных столкновений, вы можете рассматривать их как последовательность парных столкновений следующим образом.

Позволять н быть число частиц, которые сталкиваются вместе в одном месте. Позволять С быть совокупностью всех н ( н 1 ) / 2 попарно возможных столкновений. Для каждого с Дж е С выбираются случайным образом, обрабатывают коллизии между парами и делают то же самое для всех пар.

Проблемы с этим подходом:

  • Если сталкивается много частиц, вы можете в конечном итоге обработать столкновения, которые фактически не должны происходить;

  • Лучший способ реализовать такой подход — начать с внешних столкновений и «нырнуть» во внутренние. Однако это также увеличит сложность кода, поскольку вам придется вычислять расстояние до центра (массы) множества частиц и иметь массив с отсортированными расстояниями.

Это нежизнеспособное решение, потому что уже произошло несколько столкновений. В будущем я планирую добавить больше сил, таких как EM и Gravity. Заранее рассчитывать будущие столкновения будет слишком дорого.
Моя идея заключалась в следующем: если происходит столкновение с 3 и более частицами одновременно т + Δ т затем проверьте, происходит ли это вовремя т + Δ т / 2 и продолжайте делить интервал пополам. Я согласен, что это может быть дорого, если в небольшом объеме много частиц. Однако то, как вы сейчас моделируете, также может быть неточным, если вы заметите столкновение только после большой суперпозиции частиц, т. е. когда столкновение произойдет в начале интервала. [ т ; т + Δ т ] . Я отредактировал другую идею для множественных столкновений.
Обратите внимание, что предложение, которое я сделал для разделения времени, может быть применено только к паре, которая сталкивается, т. е. только для этой пары вы должны вычислить промежуточный временной шаг. т + ϵ Δ т и тогда только для этой пары вам нужно будет вычислить другой момент времени в т + Δ т .