Exemple #1
0
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])
Exemple #2
0
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)
Exemple #4
0
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$')
Exemple #6
0
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')
Exemple #15
0
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])