2013-04-22 216 views
0

我怎樣才能找到我的軌跡和(384400,0,0)之間的壁櫥距離?找到點與曲線之間的距離python

另外,我怎樣才能從(384400,0,0)到時間t = 197465路徑的距離?

我知道數組有數據,但有沒有辦法讓它檢查所有點的距離(x,y,z)並返回我在找什麼?

import numpy as np 
from scipy.integrate import odeint 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

me = 5.974 * 10 ** (24) # mass of the earth          
mm = 7.348 * 10 ** (22) # mass of the moon          
G = 6.67259 * 10 ** (-20) # gravitational parameter        
re = 6378.0 # radius of the earth in km           
rm = 1737.0 # radius of the moon in km           
r12 = 384400.0 # distance between the CoM of the earth and moon     
M = me + mm 

pi1 = me/M 
pi2 = mm/M 
mue = 398600.0 # gravitational parameter of earth km^3/sec^2      
mum = G * mm # grav param of the moon           
mu = mue + mum 
omega = np.sqrt(mu/r12 ** 3) 
nu = -129.21 * np.pi/180 # true anomaly angle in radian      

x = 327156.0 - 4671 
# x location where the moon's SOI effects the spacecraft with the offset of the 
# Earth not being at (0,0) in the Earth-Moon system        
y = 33050.0 # y location              

vbo = 10.85 # velocity at burnout            

gamma = 0 * np.pi/180 # angle in radians of the flight path     

vx = vbo * (np.sin(gamma) * np.cos(nu) - np.cos(gamma) * np.sin(nu)) 
# velocity of the bo in the x direction           
vy = vbo * (np.sin(gamma) * np.sin(nu) + np.cos(gamma) * np.cos(nu)) 
# velocity of the bo in the y direction           

xrel = (re + 300.0) * np.cos(nu) - pi2 * r12 
# spacecraft x location relative to the earth   
yrel = (re + 300.0) * np.sin(nu) 

# r0 = [xrel, yrel, 0]               
# v0 = [vx, vy, 0]                
u0 = [xrel, yrel, 0, vx, vy, 0] 


def deriv(u, dt): 
    n1 = -((mue * (u[0] + pi2 * r12)/np.sqrt((u[0] + pi2 * r12) ** 2 
               + u[1] ** 2) ** 3) 
     - (mum * (u[0] - pi1 * r12)/np.sqrt((u[0] - pi1 * r12) ** 2 
               + u[1] ** 2) ** 3)) 
    n2 = -((mue * u[1]/np.sqrt((u[0] + pi2 * r12) ** 2 + u[1] ** 2) ** 3) 
     - (mum * u[1]/np.sqrt((u[0] - pi1 * r12) ** 2 + u[1] ** 2) ** 3)) 
    return [u[3], # dotu[0] = u[3]            
      u[4], # dotu[1] = u[4]            
      u[5], # dotu[2] = u[5]            
      2 * omega * u[5] + omega ** 2 * u[0] + n1, # dotu[3] = that   
      omega ** 2 * u[1] - 2 * omega * u[4] + n2, # dotu[4] = that   
      0] # dotu[5] = 0              


dt = np.arange(0.0, 320000.0, 1) # 200000 secs to run the simulation    
u = odeint(deriv, u0, dt) 
x, y, z, x2, y2, z2 = u.T 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.plot(x, y, z) 
plt.show() 

回答

2

爲了找到沿着軌跡的每個點的距離:

my_x, my_y, my_z = (384400,0,0) 

delta_x = x - my_x 
delta_y = y - my_y 
delta_z = z - my_z 
distance = np.sqrt(np.power(delta_x, 2) + 
        np.power(delta_y, 2) + 
        np.power(delta_z, 2)) 

然後找到分鐘和特定的距離:

i = np.argmin(distance) 
t_min = i/UNITS_SCALE # I can't tell how many units to a second. Is it 1.6? 
d_197465 = distance[int(197465 * UNITS_SCALE)] 

PS,我不是火箭科學家,因此實際上並沒有檢查上面的東西x, y, z, x2, y2, z2 = u.T。我假設那些是你的軌跡的位置和速度?

+1

速度在不同的位置變化,所以沒有設定每個距離的時間。 – dustin 2013-04-23 00:20:54

+0

是的,這些是位置和速度。 – dustin 2013-04-23 00:29:39

+0

我們如何將距離放入數組?然後我們可以請求返回一個數組的最小值。 – dustin 2013-04-23 01:12:57