简体   繁体   中英

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..

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM