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?
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:
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 ;-)
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.
usuario68
Stefano Borini
dmckee --- gatito ex-moderador
Stefano Borini
Marek
justin l