Buenas, a principios de mes un amigo que estudia 3º de Física en la universidad me pidió ayuda para hacer algunos trabajos de la asignatura Física Computacional y yo acepté ayudarle a cambio de café y galletitas.
Le dieron la opción de elegir el lenguaje de programación a usar con preferencia sobre Fortran y Python, yo le propuse hacerlo en javascript e ir haciendo una web, pero me dijo que no. :'(
Versión de python: 2.7
Github https://github.com/JDTheRipperPC/-Python-3rd-Physics---Computational-physics (https://github.com/JDTheRipperPC/-Python-3rd-Physics---Computational-physics)
Aprovecho que le ayudo para publicar los trabajos aquí a modo de log por si a alguien le llega a interesar gráficas y pequeños simuladores de pelotitas que suben y bajan.
Iré actualizando el post a medida que vaya ayudandole con más trabajos tanto nuevos como para mejorar los que ya están empezados.
Trabajos:
2ª Ley de NewtonEl problema consiste en un cuerpo situado sobre el plano del eje x al cual se le aplica una velocidad inicial en vertical hacia arriba de 25m/s.
Calcula la posición y la velocidad cada 0.001s en cada punto, finalmente cuando el cuerpo aterrize mostrar el tiempo total transcurrido y la velocidad de llegada al suelo.
(Al principio puede asustar un poco tanta palabrería, pero el problema es más fácil de lo que parece)
Los datos del ejercicio son los siguientes:
Velocidad inicial = 25m/s
Posición (y) inicial = 0m
Aceleración = -9.8m/s**2 (gravedad)
Diferencial de tiempo = 0.001s
Para la 1ª versión del ejercicio simplemente definimos 3 funciones, cada una de ellas nos calculaba la velocidad y la posición cada 0.001s y nos imprimía los datos del tiempo transcurrido y la velocidad al aterrizar.
Nota:
Se necesitan 3 funciones, porqué una de ellas es la que obtiene el resultado con 1 ciclo de tiempo adelantado, otra con 1 ciclo de tiempo atrasado y otra con el tiempo correcto (la media del adelantado y del atrasado).
Nos definimos las constantes:
dt = .001
a = -9.8
y0 = 0
v0 = 25
A continuación nos definimos cada una de las 3 funciones:
Definición de la función FORWARD(1 ciclo de tiempo adelantado):
def forward(y, v):
i=0 #Contador de ciclos para calcular el tiempo en función de dt
while(y>=0):
i+=1
yn = y + v * dt
vn = v + a * dt
print "Posicion: ", yn, "Velocidad: ", vn
y, v = yn, vn
print "Tiempo: ", dt*i, "Velocidad: ", vn
Definición de la función BACKWARD(1 ciclo de tiempo atrasado):
def backward(y, v):
i=0 #Contador de ciclos para calcular el tiempo en función de dt
while(y>=0):
i+=1
vn = v + a * dt
yn = y + vn * dt
print "Posicion: ", yn, "Velocidad: ", vn
y, v = yn, vn
print "Tiempo: ", dt*i, "Velocidad: ", vn
Definición de la función CENTERED(Tiempo y velocidad correcto):
def centered(y, v):
i=0 #Contador de ciclos para calcular el tiempo en función de dt
while(y>=0):
i+=1
vn = v + a * dt
yn = y + (vn + v) * dt / 2
print "Posicion: ", yn, "Velocidad: ", vn
y, v = yn, vn
print "Tiempo: ", dt*i, "Velocidad: ", vn
Finalmente, la llamada a las funciones:
print "Forward"
forward(y0, v0)
print "Backward"
backward(y0, v0)
print "Centered"
centered(y0, v0)