p = Planeta(condicion_inicial) t_final = 3000. numero_pasos = 2000+1 dt= t_final / (float)(numero_pasos) x = np.zeros(numero_pasos) y = np.zeros(numero_pasos) vx = np.zeros(numero_pasos) vy = np.zeros(numero_pasos) energia = np.zeros(numero_pasos) [x[0],y[0],vx[0],vy[0]] = condicion_inicial energia[0] = p.energia_total() p.avanza_rk4(dt) resultados = p.y_actual x[1] = resultados[0] y[1] = resultados[1] vx[1] = resultados[2] vy[1] = resultados[3] energia[1] = p.energia_total() for i in range (2,numero_pasos): p.avanza_verlet(dt,x[i-2],y[i-2]) resultados = p.y_actual x[i] = resultados[0] y[i] = resultados[1] vx[i] = resultados[2] vy[i] = resultados[3] energia[i] = p.energia_total()
x = np.zeros(numero_pasos) y = np.zeros(numero_pasos) vx = np.zeros(numero_pasos) vy = np.zeros(numero_pasos) r = np.zeros(numero_pasos) energia = np.zeros(numero_pasos) perihelio = [[], [], []] [x[0], y[0], vx[0], vy[0]] = condicion_inicial r[0] = np.sqrt(x[0]**2 + y[0]**2) energia[0] = p.energia_total() p.avanza_rk4(dt) resultados = p.y_actual x[1] = resultados[0] y[1] = resultados[1] vx[1] = resultados[2] vy[1] = resultados[3] r[1] = np.sqrt(x[1]**2 + y[1]**2) energia[1] = p.energia_total() for i in range(2, numero_pasos): #pdb.set_trace() p.avanza_verlet(dt, x[i - 2], y[i - 2]) resultados = p.y_actual x[i] = resultados[0] y[i] = resultados[1]
def orbitar(CI,solucion, prt=True): ''' Esta función es cool, porque le entregas las condiciones iniciales (CI) en forma de x0,y0,vx0,vy0, además de un string con el tipo de solución que quieres, como 'euler', 'rk4' o 'verlet' y nos devuelve las coordenadas x,y y la energia total del planeta. Además de un ploteo de la órbita, apropi- adamente labelado y un ploteo de la energía vs el tiempo. La ultima parte es para que plotee, el valor default es que plotee (true or false). Ejemplo de uso: orbitar([10,0,0,0.1],'verlet') x=[0,0.1,...] y=[0,0.3,...] energia=[7,8,...] ''' if solucion=='euler': n= 2500 #grande y dsps se arregla if solucion=='rk4': n= 5000 #grande y dsps se arregla if solucion=='verlet': n=800 Aiur= Planeta(CI) #se crea el planeta if solucion=='verlet_reloaded': #caso especial para la ultima parte n=6000 Aiur= Planeta(CI,alpha=alpha2) #si es el verlet bkn se parcha dt= 1 #error si es muy chico tmax=n*dt x=[] #listas vacias a llenar y=[] pylon=[] #energia x= np.append(x,CI[0]) #llenamos con el primer termino y= np.append(y,CI[1]) pylon= np.append(pylon,Aiur.energia_total()) for i in range(tmax): #aca se hace la iteracion del paso if solucion=='euler': Aiur.avanza_euler(dt) if solucion=='rk4': Aiur.avanza_rk4(dt) if solucion=='verlet' or solucion=='verlet_reloaded': Aiur.avanza_verlet(dt) xn,yn,vxn,vyn=Aiur.y_now x= np.append(x,xn) y= np.append(y,yn) pylon= np.append(pylon,Aiur.energia_total()) times=np.linspace(0,tmax,tmax+1) if prt==True: fig1=plt.figure(1) #aca se plotea, muy standar fig1.clf() if solucion=='euler': plt.plot(x,y,'r',label= 'Trayectoria metodo Euler') plt.title('Trayectoria metodo Euler') if solucion=='rk4': plt.plot(x,y,'r',label= 'Trayectoria metodo RK4') plt.title('Trayectoria metodo RK4') if solucion=='verlet' or solucion=='verlet_reloaded': plt.plot(x,y,'r',label= 'Trayectoria metodo Verlet') plt.title('Trayectoria metodo Verlet') plt.xlabel('X') plt.ylabel('Y') plt.savefig('verlet_rld.png') plt.draw() plt.show() fig2=plt.figure(2) fig2.clf() plt.plot(times, pylon,'g') plt.xlabel('Tiempo') plt.ylabel('Energia') plt.title('Tiempo vs Energia') plt.savefig('verlet_rld_energia.png') plt.draw() plt.show() return x,y,pylon
#!/usr/bin/env python # -*- coding: utf-8 -*- from planeta import Planeta import numpy as np import matplotlib.pyplot as plt condicion_inicial = [10, 0, 0, 2] p = Planeta(condicion_inicial) dt=np.linspace(0,10000,10001) Energias=[] X=[] Y=[] for i in (dt): p.avanza_rk4(dt[i]) Energias.append(p.energia_actual) X.append(p.y_actual[0]) Y.append(p.y_actual[1]) plt.figure(1) plt.plot(Energias, dt) plt.xlabel('energia',fontsize=18) plt.ylabel('tiempo', fontsize=18) plt.figure(2) plt.plot(X, Y) plt.xlabel('x', fontsize=18) plt.ylabel('y', fontsize=18)
condicion_inicial = [10, 0, 0, 0.3] Jupiter = Planeta(condicion_inicial) x_value = [] y_value = [] E = [] dt=0.1 pasos=10500 t_values = np.array(range(pasos))*dt for i in range(pasos): x_value.append(Jupiter.y_actual[0]) y_value.append(Jupiter.y_actual[1]) E.append(Jupiter.energia_total()) Jupiter.avanza_rk4(dt) x_value = np.array(x_value) y_value = np.array(y_value) energia = np.array(E) print energia fig=plt.figure(1) plt.subplot(2, 1, 1) fig.subplots_adjust(hspace=.5) plt.plot(x_value , y_value) plt.axis('equal') plt.title('Orbita descrita por planeta,Runge-Kutta') plt.xlabel("x [m]") plt.ylabel("y [m]")
import numpy as np import matplotlib.pyplot as plt #Solucion a trayectoria condicion_inicial = [10.0, 0.0, 0.0, 0.3] Mars = Planeta(condicion_inicial) x_pos = [] y_pos = [] energia = [] dt=0.1 for i in range(10000): x_pos.append(Mars.y_actual[0]) y_pos.append(Mars.y_actual[1]) energia.append(Mars.energia_total()) Mars.avanza_rk4(dt) x_pos = np.array(x_pos) y_pos = np.array(y_pos) energia = np.array(energia) #Resultados fig = plt.figure(1) ax = fig.add_subplot(111) ax.plot(x_pos,y_pos) ax.plot(0,0,'o',color='r',linewidth=2.0) ax.set_xlabel('x [m]') ax.set_ylabel('y [m]') ax.set_xlim([-10,12]) ax.set_ylim([-12,12]) ax.set_aspect('equal')
from planeta import Planeta import numpy as np import matplotlib.pyplot as plt #Condiciones iniciales condicion_inicial=[10, 0, 0, 0.27] #Escogi Vy=0.27 p=Planeta(condicion_inicial) Pasos=800 #En este metodo necesite una cantidad moderada de pasos h=800/Pasos #para que los gráficos den cosas razonables. Con tiempo igual a T=np.linspace(0,800, Pasos) #800 se logran las 5 vueltas x=[10] y=[0] Ene=[p.EneActual] N=1 #Variable auxiliar para interar while N<Pasos: #Aplica el metodo de runge-kutta 4 definido en la clase planeta. p.avanza_rk4(h) N+=1 x.append(p.y_actual[0]) y.append(p.y_actual[1]) p.energia_total() Ene.append(p.EneActual) #Plots fig=plt.figure() fig.add_subplot(211) plt.plot(x,y) plt.title('$Trayectoria$ $y$ $Energia$ $vs$ $Tiempo$ \n $RK4$ $Con$ $v_{y}(0)=0.27$') plt.xlabel('$x$') plt.ylabel('$y$') fig.add_subplot(212) plt.plot(T, Ene) plt.xlabel('$Tiempo$')
t_total = 1000. N = 1000 t_paso= t_total/N x = np.zeros(N); y = np.zeros(N) vx = np.zeros(N); vy = np.zeros(N) E = np.zeros(N) [x[0],y[0],vx[0],vy[0]] = CI E[0] = p.energia_total() for i in range (1,N): p.avanza_rk4(t_paso) x[i] = p.y_actual[0] y[i] = p.y_actual[1] vx[i] = p.y_actual[2] vy[i] = p.y_actual[3] E[i] = p.energia_total() fig=plt.figure(1) fig.subplots_adjust(hspace=0.4) plt.subplot(2, 1, 1) plt.plot(x, y, 'r-') plt.title("Trayectoria potencial central (Metodo RK4)") plt.xlabel("x") plt.ylabel("y")
alpha = 0 condicion_inicial = [10, 0, 0, 0.2] p = Planeta(condicion_inicial,alpha) print "Energia Total", p.energia_total() contador = 0 x=np.zeros(100001) y=np.zeros(100001) t=np.linspace(0,2000,100001) E_total = np.zeros(100001) while contador<=100000: E_total[contador] = p.energia_total() x[contador] = p.y_actual[0] y[contador] = p.y_actual[1] p.avanza_rk4(0.02) contador +=1 plt.xlabel("X") plt.ylabel("Y") plt.title("Orbitas con Metodo RK4") plt.plot(x,y,'-') plt.savefig("Orbitas con Metodo RK4") plt.show() plt.xlabel("Tiempo") plt.ylabel("Energia Total") plt.title("Energia total del sistema como funcion del Tiempo") plt.plot(t,E_total,'-') plt.savefig("Energia total con Metodo RK4")
from planeta import Planeta import numpy as np import matplotlib.pyplot as plt #Solucion a trayectoria condicion_inicial = [10.0, 0.0, 0.0, 0.3] Mars = Planeta(condicion_inicial) x_pos = [] y_pos = [] energia = [] dt = 0.1 x_pos.append(Mars.y_actual[0]) y_pos.append(Mars.y_actual[1]) energia.append(Mars.energia_total()) Mars.avanza_rk4(dt) for i in range(10000): x_pos.append(Mars.y_actual[0]) y_pos.append(Mars.y_actual[1]) energia.append(Mars.energia_total()) Mars.avanza_verlet(dt) x_pos = np.array(x_pos) y_pos = np.array(y_pos) energia = np.array(energia) #Resultados fig = plt.figure(1) ax = fig.add_subplot(111) ax.plot(x_pos, y_pos) ax.plot(0, 0, 'o', color='r', linewidth=2.0)
la órbita y de la energía en el tiempo. ''' from planeta import Planeta import numpy as np import matplotlib.pyplot as plt #Solucion a trayectoria condicion_inicial = [10.0, 0.0, 0.0, 0.3] Mercury = Planeta(condicion_inicial,10**(-2.350)) x_pos = [Mercury.y_actual[0]] y_pos = [Mercury.y_actual[1]] energia = [Mercury.energia_total()] dt=0.01 Mercury.avanza_rk4(dt) for i in range(600000): x_pos.append(Mercury.y_actual[0]) y_pos.append(Mercury.y_actual[1]) energia.append(Mercury.energia_total()) Mercury.avanza_verlet(dt) x_pos = np.array(x_pos) y_pos = np.array(y_pos) energia = np.array(energia) #Calculo de instantes en perihelio y frecuencia de precesion r = np.sqrt(np.power(x_pos,2)+np.power(y_pos,2)) r_maximo = max(r) esta_en_perihelio = False tiempos_perihelio = []
def orbitar(CI, solucion, prt=True): ''' Esta función es cool, porque le entregas las condiciones iniciales (CI) en forma de x0,y0,vx0,vy0, además de un string con el tipo de solución que quieres, como 'euler', 'rk4' o 'verlet' y nos devuelve las coordenadas x,y y la energia total del planeta. Además de un ploteo de la órbita, apropi- adamente labelado y un ploteo de la energía vs el tiempo. La ultima parte es para que plotee, el valor default es que plotee (true or false). Ejemplo de uso: orbitar([10,0,0,0.1],'verlet') x=[0,0.1,...] y=[0,0.3,...] energia=[7,8,...] ''' if solucion == 'euler': n = 2500 #grande y dsps se arregla if solucion == 'rk4': n = 5000 #grande y dsps se arregla if solucion == 'verlet': n = 800 Aiur = Planeta(CI) #se crea el planeta if solucion == 'verlet_reloaded': #caso especial para la ultima parte n = 6000 Aiur = Planeta(CI, alpha=alpha2) #si es el verlet bkn se parcha dt = 1 #error si es muy chico tmax = n * dt x = [] #listas vacias a llenar y = [] pylon = [] #energia x = np.append(x, CI[0]) #llenamos con el primer termino y = np.append(y, CI[1]) pylon = np.append(pylon, Aiur.energia_total()) for i in range(tmax): #aca se hace la iteracion del paso if solucion == 'euler': Aiur.avanza_euler(dt) if solucion == 'rk4': Aiur.avanza_rk4(dt) if solucion == 'verlet' or solucion == 'verlet_reloaded': Aiur.avanza_verlet(dt) xn, yn, vxn, vyn = Aiur.y_now x = np.append(x, xn) y = np.append(y, yn) pylon = np.append(pylon, Aiur.energia_total()) times = np.linspace(0, tmax, tmax + 1) if prt == True: fig1 = plt.figure(1) #aca se plotea, muy standar fig1.clf() if solucion == 'euler': plt.plot(x, y, 'r', label='Trayectoria metodo Euler') plt.title('Trayectoria metodo Euler') if solucion == 'rk4': plt.plot(x, y, 'r', label='Trayectoria metodo RK4') plt.title('Trayectoria metodo RK4') if solucion == 'verlet' or solucion == 'verlet_reloaded': plt.plot(x, y, 'r', label='Trayectoria metodo Verlet') plt.title('Trayectoria metodo Verlet') plt.xlabel('X') plt.ylabel('Y') plt.savefig('verlet_rld.png') plt.draw() plt.show() fig2 = plt.figure(2) fig2.clf() plt.plot(times, pylon, 'g') plt.xlabel('Tiempo') plt.ylabel('Energia') plt.title('Tiempo vs Energia') plt.savefig('verlet_rld_energia.png') plt.draw() plt.show() return x, y, pylon
la órbita y de la energía en el tiempo. ''' from planeta import Planeta import numpy as np import matplotlib.pyplot as plt #Solucion a trayectoria condicion_inicial = [10.0, 0.0, 0.0, 0.3] Mercury = Planeta(condicion_inicial, 10**(-2.350)) x_pos = [Mercury.y_actual[0]] y_pos = [Mercury.y_actual[1]] energia = [Mercury.energia_total()] dt = 0.01 Mercury.avanza_rk4(dt) for i in range(600000): x_pos.append(Mercury.y_actual[0]) y_pos.append(Mercury.y_actual[1]) energia.append(Mercury.energia_total()) Mercury.avanza_verlet(dt) x_pos = np.array(x_pos) y_pos = np.array(y_pos) energia = np.array(energia) #Calculo de instantes en perihelio y frecuencia de precesion r = np.sqrt(np.power(x_pos, 2) + np.power(y_pos, 2)) r_maximo = max(r) esta_en_perihelio = False tiempos_perihelio = []