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 ;-)