Gangil Seo
Gangil Seo

Reputation: 296

Earth&Moon orbit system. My data is wrong

There is my code. I fixed it like this:

# Take 3 digits for significant figures in this code

import numpy as np
from math import *
from astropy.constants import *
import matplotlib.pyplot as plt
import time

start_time = time.time()

"""
G = Gravitational constant
g0 = Standard acceleration of gravity ( 9.8 m/s2)
M_sun = Solar mass
M_earth = Earth mass
R_sun = Solar darius
R_earth = Earth equatorial radius
au = Astronomical unit

Astropy.constants doesn't have any parameter of moon.
So I bring the data from wikipedia(https://en.wikipedia.org/wiki/Moon)
"""

M_moon = 7.342E22
R_moon = 1.737E6


M_earth = M_earth.value
R_earth = R_earth.value
G = G.value

perigee, apogee = 3.626E8, 4.054E8

position_E = np.array([0,0])
position_M = np.array([(perigee+apogee)/2.,0])
position_com = (M_earth*position_E+M_moon*position_M)/(M_earth+M_moon)

rel_pE = position_E - position_com
rel_pM = position_M - position_com

F = G*M_moon*M_earth/(position_M[0]**2)

p_E = {"x":rel_pE[0], "y":rel_pE[1],"v_x":0, "v_y":(float(F*rel_pE[0])/M_earth)**.5}
p_M = {"x":rel_pM[0], "y":rel_pM[1],"v_x":0, "v_y":(float(F*rel_pM[0])/M_moon)**.5}

print(p_E, p_M)

t = range(0,365)

data_E , data_M = [], []

def s(initial_velocity, acceleration, time):
    result = initial_velocity*time + 0.5*acceleration*time**2
    return result

def v(initial_velocity, acceleration, time):
    result = initial_velocity + acceleration*time
    return result

dist = float(sqrt((p_E["x"]-p_M['x'])**2 + (p_E["y"]-p_M["y"])**2))

xE=[]
yE=[]
xM=[]
yM=[]

data_E, data_M = [None]*len(t), [None]*len(t)



for i in range(1,366):
    data_E[i-1] = p_E
    data_M[i-1] = p_M

    dist = ((p_E["x"]-p_M["x"])**2 + (p_E["y"]-p_M["y"])**2)**0.5

    Fg = G*M_moon*M_earth/(dist**2)

    theta_E = np.arctan(p_E["y"]/p_E["x"])

    theta_M = theta_E + np.pi #np.arctan(data_M[i-1]["y"]/data_M[i-1]["x"])

    Fx_E = Fg*np.cos(theta_E)
    Fy_E = Fg*np.sin(theta_E)
    Fx_M = Fg*np.cos(theta_M)
    Fy_M = Fg*np.sin(theta_M)

    a_E = Fg/M_earth
    a_M = Fg/M_moon

    v_E = (p_E["v_x"]**2+p_E["v_y"]**2)**.5
    v_M = (p_M["v_x"]**2+p_M["v_y"]**2)**.5

    p_E["v_x"] = v(p_E["v_x"], Fx_E/M_earth, 24*3600)
    p_E["v_y"] = v(p_E["v_y"], Fy_E/M_earth, 24*3600)

    p_E["x"] += s(p_E['v_x'], Fx_E/M_earth, 24*3600)
    p_E["y"] += s(p_E['v_y'], Fy_E/M_earth, 24*3600)

    p_M["v_x"] = v(p_M["v_x"], Fx_M/M_moon, 24*3600)
    p_M["v_y"] = v(p_M["v_y"], Fy_M/M_moon, 24*3600)

    p_M["x"] += s(p_M['v_x'], Fx_M/M_moon, 24*3600)
    p_M["y"] += s(p_M['v_y'], Fy_M/M_moon, 24*3600)

for i in range(0,len(t)):
    xE += data_E[i]["x"]
    yE += data_E[i]["y"]
    xM += data_M[i]["x"]
    yM += data_M[i]["y"]

print("\n Run time \n --- %d seconds ---" %(time.time()-start_time))

after run this code i tried to print data_E and data_M. Then I can get data but there is no difference. All of the data is the same. But when I printed data step by step, it totally different. I have wrong data problem and increase distance problem. Please help me this problem..

Upvotes: 0

Views: 76

Answers (1)

R. J. Mathar
R. J. Mathar

Reputation: 11

The code exits near line 45, where you are trying to assign p_E by pulling the square root of a negative number on the right hand side (as you've moved the [0] coordinate of the Earth to negative values while shifting Earth and Moon into the coordinate system of their center of mass). In line 45, the value of F*rel_pE[0]/M_earth is negative. So the code never reaches the end of the program using python 2.7.14. That bug needs to be solved before trying to discuss any further aspects.

Upvotes: 1

Related Questions