import numpy as np import matplotlib.pyplot as plt object = str(input("Would you like to calculate the orbit for Earth or Halley's Comet? (E/H): ")) au_m = 149597870700 G = 6.673e-11 # Gravitational constant [N (m/kg)^2] M = 1.9891e30 # Solar mass [kg] if (object=='E' or object=='e'): a = 1.000*au_m epsilon = 0.017 m = 5.9763e24 aphelion = a*(1+epsilon)/au_m perihelion = a*(1-epsilon)/au_m R = a*(1-epsilon) T = (2*np.pi)*np.sqrt((a**3)/G/M) E = G*M*m/2/a #V0 = np.sqrt(G*(M+m)*((2/R)-(1/a)))*T/R elif (object=='H' or object=='h'): a = 17.95*au_m epsilon = 0.967 m = 1e14 aphelion = a*(1+epsilon)/au_m perihelion = a*(1-epsilon)/au_m R = a*(1-epsilon) T = (2*np.pi)*np.sqrt((a**3)/G/M) E = G*M*m/2/a #V0 = np.sqrt(G*(M+m)*((2/R)-(1/a)))*T/R Vcross = np.sqrt(G*(M+m)*((2/(1.000*au_m))-(1/a)))/1e3 C = (G*M*T**2)/(R**3) # Initial conditions X0 = 1 U0 = 0 Y0 = 0 V0 = np.sqrt(G*(M+m)*((2/R)-(1/a)))*T/R # Get number of steps per orbit tau = 5 N = int(input("How many steps would you like to calculate per orbit? "))*tau dt = tau/(N) t = np.linspace(0,tau,N)*T/24/3600 # Define Runge-Kutta functions def F1(X_, Y_, U_, V_): # dX/dtau return U_ def F2(X_, Y_, U_, V_): # dY/dtau return V_ def F3(X_, Y_, U_, V_): # dU/dtau return -C * ( X_/( (np.sqrt(X_**2 + Y_**2) )**3) ) def F4(X_, Y_, U_, V_): # dV/dtau return -C * ( Y_/( (np.sqrt(X_**2 + Y_**2) )**3) ) # Initialize solution arrays X_4RK = np.zeros(N) Y_4RK = np.zeros(N) U_4RK = np.zeros(N) V_4RK = np.zeros(N) # Set initial position and velocity in the x array and y-velocity array X_4RK[0] = X0 V_4RK[0] = V0 # Perform 4th order Runge-Kutta for n in range(N-1): k_x1 = dt * F1( X_4RK[n], Y_4RK[n], U_4RK[n], V_4RK[n] ) k_y1 = dt * F2( X_4RK[n], Y_4RK[n], U_4RK[n], V_4RK[n] ) k_u1 = dt * F3( X_4RK[n], Y_4RK[n], U_4RK[n], V_4RK[n] ) k_v1 = dt * F4( X_4RK[n], Y_4RK[n], U_4RK[n], V_4RK[n] ) k_x2 = dt * F1( X_4RK[n] + k_x1/2, Y_4RK[n] + k_y1/2, U_4RK[n] + k_u1/2, V_4RK[n] + k_v1/2 ) k_y2 = dt * F2( X_4RK[n] + k_x1/2, Y_4RK[n] + k_y1/2, U_4RK[n] + k_u1/2, V_4RK[n] + k_v1/2 ) k_u2 = dt * F3( X_4RK[n] + k_x1/2, Y_4RK[n] + k_y1/2, U_4RK[n] + k_u1/2, V_4RK[n] + k_v1/2 ) k_v2 = dt * F4( X_4RK[n] + k_x1/2, Y_4RK[n] + k_y1/2, U_4RK[n] + k_u1/2, V_4RK[n] + k_v1/2 ) k_x3 = dt * F1( X_4RK[n] + k_x2/2, Y_4RK[n] + k_y2/2, U_4RK[n] + k_u2/2, V_4RK[n] + k_v2/2 ) k_y3 = dt * F2( X_4RK[n] + k_x2/2, Y_4RK[n] + k_y2/2, U_4RK[n] + k_u2/2, V_4RK[n] + k_v2/2 ) k_u3 = dt * F3( X_4RK[n] + k_x2/2, Y_4RK[n] + k_y2/2, U_4RK[n] + k_u2/2, V_4RK[n] + k_v2/2 ) k_v3 = dt * F4( X_4RK[n] + k_x2/2, Y_4RK[n] + k_y2/2, U_4RK[n] + k_u2/2, V_4RK[n] + k_v2/2 ) k_x4 = dt * F1( X_4RK[n] + k_x3, Y_4RK[n] + k_y3, U_4RK[n] + k_u3, V_4RK[n] + k_v3 ) k_y4 = dt * F2( X_4RK[n] + k_x3, Y_4RK[n] + k_y3, U_4RK[n] + k_u3, V_4RK[n] + k_v3 ) k_u4 = dt * F3( X_4RK[n] + k_x3, Y_4RK[n] + k_y3, U_4RK[n] + k_u3, V_4RK[n] + k_v3 ) k_v4 = dt * F4( X_4RK[n] + k_x3, Y_4RK[n] + k_y3, U_4RK[n] + k_u3, V_4RK[n] + k_v3 ) X_4RK[n+1] = (X_4RK[n] + k_x1/6 + k_x2/3 + k_x3/3 + k_x4/6) Y_4RK[n+1] = (Y_4RK[n] + k_y1/6 + k_y2/3 + k_y3/3 + k_y4/6) U_4RK[n+1] = U_4RK[n] + k_u1/6 + k_u2/3 + k_u3/3 + k_u4/6 V_4RK[n+1] = V_4RK[n] + k_v1/6 + k_v2/3 + k_v3/3 + k_v4/6 # Is the orbit closed? initial = np.sqrt((X_4RK[0]*au_m)**2+(Y_4RK[0]*au_m)**2) final = np.sqrt((X_4RK[N-1]*au_m)**2+(Y_4RK[N-1]*au_m)**2) if (abs(initial-final)0): theta[i] = np.arccos(x[i]/(np.sqrt((x[i])**2+(y[i])**2)))*180/np.pi else: theta[i] = 360-np.arccos(x[i]/(np.sqrt((x[i])**2+(y[i])**2)))*180/np.pi plt.figure(figsize=(16,5)) plt.plot(theta, vtotal[0:int(N/tau)], 'k') #plt.plot(theta, vtotal, 'g') plt.xlabel(r'$\theta$ (degrees)', fontsize=20) plt.ylabel(r'Orbital Velocity (km/s)', fontsize=20) if (object=='E' or object=='e'): plt.title("Earth's Orbital Velocity vs Angle") elif (object=='H' or object=='h'): plt.title("Halley's Orbital Velocity vs Angle") plt.savefig('vel_angle.eps', dpi=500) plt.show()