2013-04-23 3 views
1

나는 다른 포스트 [포인트와 커브 사이의 거리 [find the distance between a point and a curve python]에서이 방법을 수행했지만 잘못된 것이 있습니다. 값이 정확하지 않습니다.배열로부터 최소 거리

이 동일한 궤적을 Mathematica에서 플롯하고 약간의 거리를 확인한 결과 파이썬이 최소 209000을 반환하는 18000만큼 낮은 거리를 발견했습니다.

코드 하단에 어떤 오류가 있습니까?

EDIT이 코드에 오류가 발생했습니다. 이제 모든 것이 체크 아웃됩니다. 감사.

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() 


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.array([np.sqrt(delta_x ** 2 + delta_y ** 2 + 
      delta_z ** 2)]) 

print(distance.min()) 
+0

난 당신의 코드를 실행하는 시도하고 말 때문에'my_x','my_y'쪽으로 걸어와'my_z'을 정의되지 않습니다. 그 배열은 무엇이되어야합니까? – spencerlyon2

+0

@ spencerlyon2 내 사과'my_x, my_y, my_z = (384400,0,0)' – dustin

+1

오류가있는 곳을 자세히 설명하고 질문을 삭제하십시오. –

답변

1

수정 코드는

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[4] + omega ** 2 * u[0] + n1, # dotu[3] = that   
      omega ** 2 * u[1] - 2 * omega * u[3] + 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() 


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.array([np.sqrt(delta_x ** 2 + delta_y ** 2 + 
      delta_z ** 2)]) 

print(distance.min()) 
+0

이것을 허용 된 대답으로 표시해야합니다. – askewchan

+0

@askewchan 나는 또 다른 13mins를위한 수 없습니다. – dustin

+0

안녕하세요. 그냥 "어제"라고 했으므로 시간이 충분하다고 생각했습니다. :) – askewchan

관련 문제