Simule un impacto físico de objetos hechos de elementos finitos y pequeños

Quiero simular un impacto entre dos cuerpos según la gravedad y, finalmente, considerar otras fuerzas para unir la materia. Me gustaría usar python para hacer esto, pero estoy abierto a otras alternativas. ¿Qué tipo de herramientas o bibliotecas puedo usar para realizar esta tarea?

¿Algo como motor de física del juego? (Leyes de Newton+detección de colisión con fricción)
@mbq: ¿conoces uno bueno y fácil, posiblemente utilizable a través de python?
Debo decir que la frase "física de partículas" en su título es confusa. Me preguntaba qué modelo ibas a usar para la producción de piones...
@dmckee: tienes toda la razón
Hace mucho tiempo estaba haciendo algo de programación con ODE . También hay un motor Bullet del que solo escuché hablar. Supongo que ambos podrían tener enlaces de python. Pero ciertamente use algunas herramientas y olvídese de escribir un motor razonable (en el sentido de capaz de simular cualquier cosa que se parezca a la realidad), no vale la pena. Simplemente busque motores en Google, estoy seguro de que encontrará aún más de ellos. Y también intente preguntar en StackOverflow, ya que los programadores usan estos motores con mucha más frecuencia que los físicos, creo (por ejemplo, en los juegos).
Encontrará respuestas mucho mejores en sitios adaptados específicamente al campo de su pregunta, incluidos Stack Overflow y Game Development .

Respuestas (3)

Recientemente hice algo como esto, para simular un sistema de dos masas conectadas por un resorte. Esas masas yacen horizontalmente en un plano sin fricción. Una de estas masas recibió un impulso inicial y, a partir de entonces, el sistema quedó solo. Mientras todo el sistema (el controide para ser exactos) se mueve con velocidad constante, las dos masas están oscilando, mientras avanzan. Aquí hay un breve dibujo ASCII del sistema.

 Initial Impulse     ______              ______ 
 ---->               | m1 |/\/\/\/\/\/\/\| m2 |
_____________________|____|______________|____|______________________

Después de escribir las ecuaciones diferenciales, escribí un pequeño programa en Python que simulaba el problema. Este programa se basa en el método de los pequeños pasos (también llamado Método Eueler). Aquí está el artículo de wikipedia correspondiente:

http://en.wikipedia.org/wiki/Euler_method

Implementé este algoritmo para el problema descrito anteriormente y tracé los resultados usando gnuplot:

gnuplot.info (solo puedo agregar un hipervínculo, así que agregue www)

Pero usted es libre de usar cualquier herramienta que desee para este propósito. Aquí viene el código fuente de mi pequeño programa:

#!/usr/bin/python
import os

steps = 100000
time = 100.

# Initial conditions
D = 0.9
m1 = 1.2
m2 = 0.4
v1 = 1.3
v2 = 0.
x1 = 0.
x2 = 1.
l = 1.

#Since I also tried to implement other algorithmus i specify which one to use
Euler = 1


#Euler 

if Euler == 1:
    timesteps = time / steps
    # Open the files for writing the results to
    f = open('results_x1', 'w')
    f2 = open('results_x2', 'w')
    f3 = open('results_com', 'w')

    # The real calculation   
    for i in range(0,steps):
        x1 = x1 + (D * (x2 - x1 -l) / m1)* (timesteps**2) + v1 * timesteps
        x2 = x2 - (D * (x2 - x1 -l) / m2)* (timesteps**2) + v2 * timesteps
        v1 = v1 + (D * (x2 - x1 -l) / m1)* (timesteps)
        v2 = v2 - (D * (x2 - x1 -l) / m2)* (timesteps)  
        f.write(str(i*timesteps) + " " + str(x1) + "\n")
        f2.write(str(i*timesteps) + " " + str(x2) + "\n")
        f3.write(str(i*timesteps) + " " + str((x1*m1 + x2*m2)/(m1+m2)) + "\n")


    f.close()
    f2.close()
    f3.close()

Por supuesto, hay algoritmos mejores que el de Euler, pero este es definitivamente el más fácil de implementar (fallé al implementar algoritmos más avanzados ;-)).

Así que estos son los pasos que probablemente deberías seguir:

  • Escriba las ecuaciones diferenciales para su problema
  • Comprender el método de Euler
  • Tome mi código como punto de referencia y modifíquelo para su problema

Sé que este es un tema bastante extenso y que, por lo tanto, mi respuesta es solo superficial. Solo dime de qué quieres saber más e intentaré agregar los comentarios correspondientes ;-)

Una buena alternativa al método de Euler es la integración de Verlet , que tiende a ser más estable y precisa que el método de Euler.
Vaya, Jeah, no había oído hablar de eso. Parece muy agradable. Si tengo un poco de tiempo libre, le echaré un vistazo, gracias.

Visite el sitio de Ron Fedkiw ; es un buen punto de partida con un conjunto completo de palabras clave.

depende del tipo de simulación que intente construir:

si su simulación tiene el propósito de construir un modelo de simulación que, por ejemplo, evite el ruido experimental, tal vez con un algoritmo dinámico complejo, etc., creo que C o C++ son las mejores opciones.

Si, por otro lado, desea crear una simulación rápida con salida gráfica y herramientas de análisis integradas (tal vez incluso con fines didácticos), ¡Python es su elección! en este caso, le sugiero que consulte Enthought Python Distribution ... para uso académico, es gratuito y tiene una versión incorporada de scipy.

ok, pero no estoy preguntando sobre una distribución científica de python. No quiero volver a implementar la dinámica corporal desde cero.