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] vx[i] = resultados[2] vy[i] = resultados[3] energia[i] = p.energia_total() r[i] = np.sqrt(x[i]**2 + y[i]**2) tolerancia = 0.000005 valor_estimado = 10 if es_perihelio(r[i], valor_estimado, tolerancia): perihelio[0].append(p.t_actual) perihelio[1].append(x[i]) perihelio[2].append(y[i])
p = Planeta(condicion_inicial) # se establece condicio inicial como actuales pasos = 16500 dt = 8000.0 / pasos t = np.linspace(0, 8000, pasos) # aproximadamente 5 orbitas # se crean listas vacias de x, y, Energia x = np.zeros(pasos) y = np.zeros(pasos) e = np.zeros(pasos) # Se agregan condiciones iniciales x[0] = 0 y[0] = 0 e[0] = p.energia_total() for i in range(1, pasos): p.avanza_verlet(dt) x[i] = p.y_actual[0] y[i] = p.y_actual[1] e[i] = p.energia_total() p.energia_total() # Energia.append(p.energia_total()) plt.figure(1) # the first figure plt.subplot(211) # the first subplot in the first figure plt.xlabel("$X$", fontsize=15) plt.ylabel("$Y$", fontsize=15) plt.title("$\ Metodo \ Verlet \ con \ alpha = 0$") plt.plot(x, y) plt.subplot(212) # the second subplot in the first figure
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() fig=plt.figure(1) plt.subplot(2, 1, 1) fig.subplots_adjust(hspace=.5) plt.plot(x , y, label = "Trayectoria") plt.title("Trayectoria bajo un potencial central, Verlet") plt.xlabel("X") plt.ylabel("Y") t_values = np.linspace(1,t_final,numero_pasos)
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
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=8000 #Aca la cantidad de pasos no influye mucho, pero h=800/Pasos #se observo que con tiempo de 800 da las 5 vueltas T=np.linspace(0,800, Pasos) x=[10] y=[0] Ene=[p.EneActual] N=1 #Variable auxiliar para interar while N<Pasos: #Aplica el metodo de verlet definido en la clase planeta. p.avanza_verlet(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 $Verlet$ $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 = 5000. 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_verlet(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, 'm-') plt.title("Trayectoria potencial central (Metodo Verlet)") 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_verlet(0.02) contador +=1 print np.shape(t),np.shape(x) plt.xlabel("X") plt.ylabel("Y") plt.title("Orbitas con Metodo de Verlet") plt.plot(x,y,'-') plt.savefig("Orbitas con Metodo de Verlet") 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 Metodo de Verlet")
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) ax.set_xlabel('x [m]') ax.set_ylabel('y [m]') ax.set_xlim([-10, 12]) ax.set_ylim([-12, 12]) ax.set_aspect('equal')
E = [] dt=0.1 pasos=10000 t_values = np.array(range(pasos))*dt for i in range(pasos): if i==0: x_value.append(Jupiter.y_actual[0]) y_value.append(Jupiter.y_actual[1]) E.append(Jupiter.energia_total()) Jupiter.avanza_rk4(dt) else: x_value.append(Jupiter.y_actual[0]) y_value.append(Jupiter.y_actual[1]) E.append(Jupiter.energia_total()) Jupiter.avanza_verlet(dt) x_value = np.array(x_value) y_value = np.array(y_value) energia = np.array(E) 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(' 'u'Ó''rbita descrita por planeta, Verlet') plt.xlabel("x [m]") plt.ylabel("y [m]") plt.subplot(2, 1, 2)
Y[0] = condicion_inicial[1] VX[0] = condicion_inicial[2] VY[0] = condicion_inicial[3] ET[0] = p.energia_total() p.avanza_rk4(dt) X[1] = p.y_actual[0] Y[1] = p.y_actual[1] VX[1] = p.y_actual[2] VY[1] = p.y_actual[3] ET[1] = p.energia_total() t_values[1] = p.t_actual for i in range(2, n_pasos): Y_anterior = np.array([X[i - 2], Y[i - 2], VX[i - 2], VY[i - 2]]) p.avanza_verlet(dt, Y_anterior) X[i] = p.y_actual[0] Y[i] = p.y_actual[1] VX[i] = p.y_actual[2] VY[i] = p.y_actual[3] ET[i] = p.energia_total() t_values[i] = p.t_actual fig = plt.figure(1) plt.clf() plt.subplot(2, 1, 1) fig.subplots_adjust(hspace=.5) plt.plot( X, Y, )
condicion_inicial = [10, 0, 0, 0.25] Shakuras = Planeta(condicion_inicial) N=3*np.int(1e4) dt=1000./N t=np.linspace(0,1000,N) x=np.zeros(N) y=np.zeros(N) E=np.zeros(N) x[0]=condicion_inicial[0] y[0]=condicion_inicial[1] E[0]=Shakuras.energia_total() for n in range(1,N): Shakuras.avanza_verlet(dt) x[n]=Shakuras.y_actual[0] y[n]=Shakuras.y_actual[1] E[n]=Shakuras.energia_total() print t print x print E ax1=fig.add_subplot(211) ax1.plot(x,y) ax2=fig.add_subplot(212) ax2.plot(t,E) ax1.set_xlabel('Posicion en el eje X') ax1.set_ylabel('Posicion en el eje Y') ax2.set_xlabel('Tiempo') ax2.set_ylabel('Energia total')
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 = [] angulos_perihelio = [] counter=0 for i in range(len(r)): angulo_actual = np.arctan2(y_pos[i],x_pos[i])
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) ax.set_xlabel('x [m]') ax.set_ylabel('y [m]') ax.set_xlim([-10,12]) ax.set_ylim([-12,12]) ax.set_aspect('equal')
tiempo[0] = p.t_actual vx[0] = p.y_actual[2] vy[0] = p.y_actual[3] #Verlet necesita una iteracion extra p.avanza_rk4(dt) x[1] = p.y_actual[0] y[1] = p.y_actual[1] energia[1] = p.energia_total() tiempo[1] = p.t_actual vx[1] = p.y_actual[2] vy[1] = p.y_actual[3] for i in range(2, iteraciones): y_anterior = np.array([x[i-2], y[i-2], vx[i-2], vy[i-2]]) p.avanza_verlet(dt, y_anterior) x[i] = p.y_actual[0] y[i] = p.y_actual[1] vx[i] = p.y_actual[2] vy[i] = p.y_actual[3] energia[i] =p.energia_total() tiempo [i] = p.t_actual plt.figure(1) plt.clf() plt.plot(x,y,color='green') plt.xlabel('x[m]') plt.ylabel('y[m]') plt.grid(True) plt.title(' 'u'Ó''rbita calculada con el m'u'é''todo de Verlet ') plt.savefig('Orbita_verlet.eps')
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
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 = [] angulos_perihelio = [] counter = 0 for i in range(len(r)): angulo_actual = np.arctan2(y_pos[i], x_pos[i])