Quiero simular un impacto entre dos cuerpos según la gravedad, y eventualmente considerar otras fuerzas para pegar la materia. Me gustaría utilizar python para ello, pero estoy abierto a alternativas. ¿Qué tipo de herramientas o bibliotecas puedo utilizar para realizar esta tarea?
Respuestas
¿Demasiados anuncios?Hace poco hice algo así, para simular un sistema de dos masas conectadas por un muelle. Dichas masas estaban colocadas horizontalmente en un plano sin fricción. Una de estas masas recibió un impulso inicial y a partir de ahí se dejó el sistema solo. Mientras que todo el sistema (el controide que se precia) se mueve con velocidad constante, las dos masas oscilan, mientras se mueven hacia adelante. 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 para simular 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 correspondiente de la wikipedia:
http://en.wikipedia.org/wiki/Euler_method
He implementado este alogoritmo para el problema descrito anteriormente y he trazado los resultados utilizando gnuplot:
gnuplot.info (sólo se me permite añadir un hipervínculo, así que añada www)
Pero usted es libre de utilizar cualquier herramienta que desee para este fin. 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 que hay mejores alogoritmos que el de euler, pero este es definitivamente el más fácil de implementar (fracasé implementando algoritmos más avanzados ;-)).
Así que estos son los pasos que probablemente deberías seguir:
- Escribe las ecuaciones diferenciales de tu problema
- Comprender el método de Euler
- Tome mi código como punto de referencia y modifíquelo para su problema
Sé que es un tema bastante extenso y que, por tanto, mi respuesta es sólo superficial. Sólo tienes que decir lo que quieres saber más, y voy a tratar de añadir los comentarios correspondientes ;-)
Consulte el sitio de Ron Fedkiw es un buen punto de partida con un amplio conjunto de palabras clave.
Depende del tipo de simulación que se intente construir:
si su simulación tiene el propósito de construir un modelo de simulación, que, por ejemplo, evita el ruido experimental, tal vez con un algoritmo de dinámica compleja y así sucesivamente, creo que C o C ++ son las mejores opciones..
Si por el contrario quieres crear una simulación rápida con salida gráfica y herramientas de análisis incorporadas (quizás incluso con fines didácticos), python es tu opción! en este caso te sugiero que consultes el Distribución de Python Enthought .. para uso académico es freeware y tiene una versión incorporada de scipy.