Estado del sistema NNN-cuerpo después del tiempo ttt (colisión elástica y sin gravedad)

Estoy creando un juego basado en un simulador de partículas de gas. Todos los nodos (círculos verdes) representan partículas gaseosas y chocan elásticamente.

Mi algoritmo explica correctamente las colisiones de dos partículas, ya que la velocidad final se calcula aplicando directamente una ecuación. Sin embargo, falla si tres o más partículas se superponen (colisionan) en el mismo tiempo de reloj (marco).

Mi pregunta es ¿cómo puedo calcular las velocidades finales de una colisión con más de dos partículas colisionando? Tenga en cuenta que si A choca con B y B choca con C, no es necesario que A choque con C (B puede estar en el centro).

¿Hay un algoritmo diseñado específicamente para esto?

Simulador: https://gravitifydemo1.github.io/

El impulso es incorrecto (al momento de escribir). Sin embargo, el gráfico KE está cambiando su valor. Si el algoritmo para colisiones de dos partículas funcionara correctamente, la KE no cambiaría. El gráfico es constante la mayor parte del tiempo, pero sube y baja.

Respuestas (1)

Una solución parcial sería usar pasos de tiempo adaptables, es decir, cuando detecta múltiples colisiones con la misma partícula a la vez. t + Δ t , su paso de tiempo se reduce para que solo ocurra una colisión con esa partícula, es decir, calcula las posiciones en t + ϵ Δ t , con 0 < ϵ < 1 .

No resuelve todos los problemas, pero reducirá la probabilidad de que ocurra una colisión múltiple en un solo paso de tiempo.


Editar: con respecto a las colisiones múltiples, puede tratarlas como una secuencia de colisiones por pares de la siguiente manera.

Dejar norte Sea el número de partículas que chocan entre sí en un lugar. Dejar S ser el conjunto de todos norte ( norte 1 ) / 2 posibles colisiones por parejas. Para cada s j S seleccionado al azar, procese la colisión entre el par y haga lo mismo para todos los pares.

Problemas con este enfoque:

  • Si chocan muchas partículas, puede terminar procesando colisiones que efectivamente no deberían ocurrir;

  • Una mejor manera de hacer este tipo de enfoque sería comenzar con las colisiones externas y "zambullirse" en las internas. Sin embargo, esto también aumentará la complejidad del código, ya que tendrá que calcular la distancia al centro (de masa) del conjunto de partículas y tener una matriz con las distancias ordenadas.

Esa no es una solución viable, porque ya ocurrieron múltiples colisiones. Planearé agregar más fuerzas en el futuro, como EM y Gravity. Será demasiado costoso calcular futuras colisiones con anticipación.
Mi idea era la siguiente: si ocurre una colisión con 3 o más partículas a la vez t + Δ t luego verifique si sucede en el tiempo t + Δ t / 2 y sigue dividiendo por la mitad el intervalo. Estoy de acuerdo en que puede ser costoso si hay muchas partículas en un volumen pequeño. Sin embargo, la forma en que está modelando en este momento también puede ser inexacta si solo detecta la colisión después de una gran superposición de las partículas, es decir, cuando la colisión ocurre al comienzo del intervalo. [ t ; t + Δ t ] . He editado con otra idea para múltiples colisiones.
Tenga en cuenta que la sugerencia que hice para la fracción de tiempo solo se puede aplicar al par que choca, es decir, solo para ese par calcularía un paso de tiempo intermedio t + ϵ Δ t y luego solo para ese par necesitarías calcular otro punto de tiempo en t + Δ t .