x0, v0, w0, t0 = 1.0, 0., 3., 0 sim_params = w0 deltat = 0.1988 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" num_method = m2 pendulo = os.Oscillator(x0, v0, w0, t0, "P1") pendulo_force = fr.Forces(restoring_force, sim_params) pendulo.set_force(pendulo_force) euler = sol.Solver(pendulo, num_method, deltat) tvac, xvac, vac = integrate(euler) en_ci, en_po, en_to = energies(tvac, xvac, vac) delta_e = en_to[-1] - en_to[0] print("Theta: ", x0, ", v: ", v0, ", dt: ", deltat, ", de: ", delta_e) print("Energia In: ", en_to[0], ", Energia Fin: ", en_to[-1]) deltae = [] for i in range(len(en_to)): deltae.append(en_to[i] - en_to[0]) fig, ax = plt.subplots() ax.plot(tvac, xvac, ls='--', c='royalblue', label='Angle') ax.plot(tvac, vac, ls='--', c='deeppink', label='Velocity') ax.set(xlabel='time (AU)', ylabel='State (AU)')
################################################################################ # BLOQUE PRINCIPAL DE INSTRUCCIONES v0, vy = cond_init(1, 0, 0) x0, y0, v0, a0, m = 1., .0, v0, 90., 1. sim_params = m, GM deltat = 0.01 / 499.998 # para euler cromer deltat = 0.01/499.998 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" earth = pt.Particle("Earth", x0, y0, v0, a0, m) # Revisar por que a0 es 90? earth_force = fr.Forces(universal_gravity, sim_params) earth.set_force(earth_force) euler = sl.Solver(earth, m2, deltat) # El metodo mas estable es Euler Cromer xpos, ypos, tpos = [], [], [] cont = 0 em = [] for i in range(200000): xc, yc, vxc, vyc, tc = earth.get_state() v = np.sqrt(vxc**2 + vyc**2) emt = total_mechanic_energy(v, m) em.append(round(emt, 2)) xpos.append(xc) ypos.append(yc) tpos.append(tc) euler.do_step() xc1, yc1, vxc1, vyc1, tc1 = earth.get_state() if yc < 0 and yc1 >= 0:
m3 = "Midpoint" infoelipses = [] x0 = 1. vy0 = 1. for i in range(200): print("cond ini, x0 & vy0 =", round(x0, 2)) v0 = vy0 x0, y0, v0, a0, m = x0, .0, v0, 90., 1. earth = pt.Particle("Earth", x0, y0, v0, a0, m) # print(earth) earth_force = fr.Forces(universal_gravity, sim_params) earth.set_force(earth_force) euler = sl.Solver(earth, m2, deltat) xpos, ypos, tpos = [], [], [] cont = 0 for i in range(200000): xc, yc, vxc, vyc, tc = earth.get_state() # if tc > 0.415: # break xpos.append(xc) ypos.append(yc) tpos.append(tc) euler.do_step() xc1, yc1, vxc1, vyc1, tc1 = earth.get_state() if yc < 0 and yc1 >= 0: cont += 1
# v0, vy = cond_init(1, 0, 0) #orbita circular k = 1.5 # orbita eliptica # print(v0) x0, y0, v0, a0, m = k, .0, k, 90., 1. sim_params = m, GMe, W deltat = 0.01 / 128 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" satellite = pt.Particle("Satellite", x0, y0, v0, a0, m) # Revisar por que a0 es 90? satellite_force = fr.Forces(universal_gravity, sim_params) satellite.set_force(satellite_force) euler = sl.Solver(satellite, m2, deltat) # El metodo mas estable es Euler Cromer xpos, ypos, tpos = [], [], [] cont = 0 em = [] vel = [] for i in range(200000): xc, yc, vxc, vyc, tc = satellite.get_state() v = np.sqrt(vxc**2 + vyc**2) vel.append(v) emt = total_mechanic_energy(v, m, xc, yc) em.append(round(emt, 2)) xpos.append(xc) ypos.append(yc) tpos.append(tc) euler.do_step()
v0, vy = init_c(1, 0, 0) sim_params = pt.grav_ m, x0, y0, v0, a0 = 1., 1., 0., 5., 70 deltat = .0001 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" num_method = m2 earth = pt.Particle(x0, y0, v0, a0) earth_force = fr.Forces(Newton_again, sim_params) earth.set_force(earth_force) euler = sol.Solver(earth, num_method, deltat) xvac, yvac, tvac = integrate(euler) m2, x02, y02, v02, a02 = 1., 1.5, 0., 5., 70 mars = pt.Particle(x02, y02, v02, a02) f2 = fr.Forces(Newton_again, sim_params) mars.set_force(f2) i2 = sol.Solver(mars, num_method, deltat) xvac2, yvac2, tvac2 = integrate(i2) sx, sy = 0, 0 ex, ey = 1, 0. mx, my = 1.5, 0 # Muestra las orbitas de los dos planetas
v0, vy = init_c(1, 0, 0) #orbita circular k = 1.5 # orbita eliptica m, x0, y0, v0, a0 = 1., 1., .0, v0, 90. sim_params = m, GMe, A, W deltat = 0.01/128 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" num_method = m2 # m1 # m3 satellite = pt.Particle(x0, y0, v0, a0) satellite_force = fr.Forces(Newton_again, sim_params) satellite.set_force(satellite_force) euler = sl.Solver(satellite, num_method, deltat) xpos, ypos, tpos, em, vel = [], [], [], [], [] cont = 0 for i in range(200000): xc, yc, vxc, vyc, tc = satellite.get_state() v = np.sqrt(vxc**2 + vyc**2) vel.append(v) emt = mechanic_energy(v, m, xc, yc) em.append(round(emt, 2)) xpos.append(xc) ypos.append(yc) tpos.append(tc) euler.do_step() xc1, yc1, vxc1, vyc1, tc1 = satellite.get_state() if yc < 0 and yc1 >= 0:
sim_params = pt.grav_ deltat = 0.01 / 256 m1 = "Euler" m2 = "Euler-Cromer" m3 = "Midpoint" num_method = m2 # m1 # m3 # k = 2 * np.pi m, x0, y0, v0, a0 = 1., 1.5, .0, 1.5, 90. # v0 = k earth = pt.Particle(x0, y0, v0, a0) earth_force = fr.Forces(Newton_again, sim_params) earth.set_force(earth_force) euler = sl.Solver(earth, num_method, deltat) xvac, yvac, tvac, area = integrate(euler) print("Area Ini:", area[0], ", Area Fin:", area[-1]) # Muestra la orbita circular o eliptica # fig, ax = plt.subplots() # ax.plot(xvac, yvac, '--', c = 'purple', label=num_method) # # ax.set(xlabel='x (a.u.)', ylabel='y (a.u.)') # Muestra grafica area vs tiempo fig, ax = plt.subplots() ax.plot(tvac, area, '--', c='purple', label=num_method) ax.set(xlabel='t (yr)', ylabel="A (a.u.**2)")
######################################################## planet1 = pt.Particle("Planet 1", x02, y02, v02, a02, m2) planet1.set_force(fr.Forces(grav_force, pt.GM)) planet2 = pt.Particle("Planet 2", x02, y02, v02, a02, m2) planet2.set_force(fr.Forces(grav_force, pt.GM)) planet3 = pt.Particle("Planet 3", x02, y02, v02, a02, m2) planet3.set_force(fr.Forces(grav_force, pt.GM)) xpos1, ypos1, tpos1, energy1 = [], [], [], [] xpos2, ypos2, tpos2, energy2 = [], [], [], [] xpos3, ypos3, tpos3, energy3 = [], [], [], [] numeric1 = sv.Solver(planet1, "Euler", deltat) numeric2 = sv.Solver(planet2, "Euler-Cromer", deltat) numeric3 = sv.Solver(planet3, "Midpoint", deltat) #euler(planet1, numeric1, xpos1, ypos1, tpos1, energy1) euler_cromer(planet2, numeric2, xpos2, ypos2, tpos2, energy2) #midpoint(planet3, numeric3, xpos3, ypos3, tpos3, energy3) ######################################################### planet1p = pt.Particle("Planet 1p", x01, y01, v01, a01, m1) planet1p.set_force(fr.Forces(grav_force, pt.GM)) planet2p = pt.Particle("Planet 2p", x01, y01, v01, a01, m1) planet2p.set_force(fr.Forces(grav_force, pt.GM))
planet3 = pt.Particle("Planet Z", x0, y0, v0, a0, m) planet3.set_force(planet_force) xposEuler = [] yposEuler = [] tposEuler = [] xposEulerCromer = [] yposEulerCromer = [] tposEulerCromer = [] xposMidpoint = [] yposMidpoint = [] tposMidpoint = [] numeric1 = sv.Solver(planet, "Euler", deltat) numeric2 = sv.Solver(planet2, "Euler-Cromer", deltat) numeric3 = sv.Solver(planet3, "Midpoint", deltat) #euler(planet, numeric1, xposEuler, yposEuler, tposEuler) euler_cromer(planet2, numeric2, xposEulerCromer, yposEulerCromer, tposEulerCromer) #midpoint(planet3, numeric3, xposMidpoint, yposMidpoint, tposMidpoint) #Generate Plots fig, ax = plt.subplots() #ax.plot(xposEuler, yposEuler, '-', label='Euler') ax.plot(xposEulerCromer, yposEulerCromer, '-', label='Euler-Cromer') #ax.plot(xposMidpoint, yposMidpoint, '-', label='Midpoint')
m1, x01, y01, v01, a01 = 1., 2., 0., 4.442882938, 90 m2, x02, y02, v02, a02 = 1., 1., 0., 8., 90 deltat = 0.001 planet1 = pt.Particle("Planet X", x01, y01, v01, a01, m1) planet1.set_force(fr.Forces(grav_force, pt.GM)) planet2 = pt.Particle("Planet Y", x02, y02, v02, a02, m2) planet2.set_force(fr.Forces(grav_force, pt.GM)) xpos1, ypos1, tpos1, energy1 = [], [], [], [] xpos2, ypos2, tpos2, energy2 = [], [], [], [] numeric1 = sv.Solver(planet1, "Euler-Cromer", deltat) numeric2 = sv.Solver(planet2, "Euler-Cromer", deltat) euler_cromer(planet1, numeric1, xpos1, ypos1, tpos1, energy1) euler_cromer(planet2, numeric2, xpos2, ypos2, tpos2, energy2) #Generate Plots ------------------------------------------------- fig, ax = plt.subplots() ax.plot(xpos1, ypos1, '-', label='Planet X') ax.plot(xpos2, ypos2, '-', label='Planet Y') #ax.plot(tpos1, energy1, '-', label='Energy Planet X') #ax.plot(tpos2, energy2, '--', label='Energy Planet Y') ax.set(xlabel='x (a.u.)', ylabel='y (a.u.)', title='Two planets')
# BEGINNING-OF-EXECUTION deltat, num_method = .001, "Euler-Cromer" x0, y0, v0, a0 = 1., .0, .9, 90 r0 = np.sqrt(x0**2 + y0**2) v0 = 1.3 * np.sqrt(GM / r0) # create free-falling Particle sim_params = GM planet = pt.Particle("Earth", x0, y0, v0, a0) the_force = fr.Forces(newton_again, sim_params) planet.set_force(the_force) intor = sol.Solver(planet, num_method, deltat) xvac, yvac, tvac = integrate(intor) print("x", len(xvac), "y", len(xvac)) # generate plots fig, ax = plt.subplots() label = 'x0 = %.2f, y0 = %.2f, v0 = %.2f, a0 = %.2f' % (x0, y0, v0, a0) ax.plot(xvac, yvac, '-', label=label) ax.set_aspect('equal') ax.set(xlabel='x (AU)', ylabel='y (AU)', title='Real free falling') ax.grid() plt.legend() plt.show()
tpos.append(tc) obj.do_step() return xpos, ypos, tpos # BEGINNING-OF-EXECUTION deltat, num_method = .005, "Midpoint" m, x0, y0, v0, a0 = 1., 0., .0, 1., 75 # create free-falling Particle sim_params = pt.grav_ # gravity vacuum = pt.Particle(x0, y0, v0, a0) the_force = fr.Forces(free_falling, sim_params) vacuum.set_force(the_force) intgr = sol.Solver(vacuum, num_method, deltat) xvac, yvac, tvac = integrate(intgr) # create falling Particle with linear drag sim_params = m, pt.grav_, C_DRAG # mass, gravity, drag linear = pt.Particle(x0, y0, v0, a0) the_force = fr.Forces(linear_drag, sim_params) linear.set_force(the_force) intgr = sol.Solver(linear, num_method, deltat) xlin, ylin, tlin = integrate(intgr) # create falling Particle with quadratic drag sim_params = m, pt.grav_, C_DRAG # mass, gravity, drag qdatic = pt.Particle(x0, y0, v0, a0) the_force = fr.Forces(quadratic_drag, sim_params) qdatic.set_force(the_force)
# BEGINNING-OF-EXECUTION deltat = .01 m, x0, y0, v0, a0 = 1., 0., .0, 1., 45 sim_params = m, pt.grav_, pt.drag_ # mass, gravity, drag # create Particle and set force ball = pt.Particle(x0, y0, v0, a0, m) ball_force = fr.Forces(resistive_falling, sim_params) ball.set_force(ball_force) print("Projectile:", ball) # ########## do time evolution ########## # create an Euler solver to evolve Particle euler = sol.Solver(ball, "Euler", deltat) print("Euler", euler) xeul, yeul, teul = integrate(euler) # create an Euler-Cromer solver to evolve Particle ball.set_state_angle(x0, y0, v0, a0, 0.) euler_cromer = sol.Solver(ball, "Euler-Cromer", deltat) print("Euler-Cromer:", euler_cromer) xeuc, yeuc, teuc = integrate(euler_cromer) # create an Midpoint solver to evolve Particle ball.set_state_angle(x0, y0, v0, a0, 0.) midpoint = sol.Solver(ball, "Midpoint", deltat) print("Midpoint", midpoint) xmid, ymid, tmid = integrate(midpoint)
planet_3 = pt.Particle("Planet Y", x0, y0, v0, a0, m) planet_3.set_force(fr.Forces(grav_force, sim_params_3)) planet_4 = pt.Particle("Planet Y", x0, y0, v0, a0, m) planet_4.set_force(fr.Forces(grav_force, sim_params_4)) planet_5 = pt.Particle("Planet Y", x0, y0, v0, a0, m) planet_5.set_force(fr.Forces(grav_force, sim_params_5)) t = [] angles_1, angles_2, angles_3, angles_4, angles_5 = [], [], [], [], [] graph_angles_1, graph_angles_2, graph_angles_3, graph_angles_4, graph_angles_5 = [], [], [], [], [] graph_time = [] numeric_1 = sv.Solver(planet_1, "Euler-Cromer", deltat) euler_cromer(planet_1, numeric_1, angles_1) numeric_2 = sv.Solver(planet_2, "Euler-Cromer", deltat) euler_cromer(planet_2, numeric_2, angles_2) numeric_3 = sv.Solver(planet_3, "Euler-Cromer", deltat) euler_cromer(planet_3, numeric_3, angles_3) numeric_4 = sv.Solver(planet_4, "Euler-Cromer", deltat) euler_cromer(planet_4, numeric_4, angles_4) numeric_5 = sv.Solver(planet_5, "Euler-Cromer", deltat) euler_cromer(planet_5, numeric_5, angles_5) val = True