2013-07-31 60 views
-1

很多次我已經在Python中使用了向量的點積,但由於某種原因,一個這樣的np.dot()命令不起作用。蟒蛇:取得與numpy向量的點積


#!/usr/bin/env ipython                

import numpy as np 
from numpy import linalg as LA 
from scipy.optimize import fsolve 

Re = 1.496e8 # semi-major axis of the Earth 
Te = 365.25 * 24.0 * 3600.0 # period of the Earth in sec 
mus = 132712000000.0 # grav param of the Sun 

def f(a): 
    return (2 * np.pi/np.sqrt(mus) * np.sqrt(a ** 3) - Te * 2.0/3.0) 


a = fsolve(f, 100000000) 

e = Re/a - 1 

rp = a * (1 - e) 
h = np.sqrt(2 * mus) * np.sqrt(Re * rp/(Re + rp)) 
vE = np.sqrt(mus/Re) 
vp = h/Re 
vinf = vE - vp 

alt = 500.0 # the flyby distance             
rph = 6378 + alt # radius at periapsis of the flyby hyperbola      
mue = 398600.0 # grav param of the Earth           

eh = 1 + rph * vinf ** 2/mue 

beta = np.arccos(1.0/eh) 

delta = 2.0 * beta 

vpvec = np.array([0, -vp, 0]) 
vinfoutvec = vinf * np.array([-np.sin(delta), np.cos(delta)]) 
vhpostvec = np.array([vinfoutvec[0], vinfoutvec[1] + vpvec[1]]) 

r0 = np.array([-Re, 0, 0]) 
v0 = np.array([vhpostvec[0], vhpostvec[1], 0]) 
h0vec = np.cross(r0, v0) 
h0 = LA.norm(h0vec) 

e2vec = np.cross(v0, h0vec)/mus - r0/LA.norm(r0) 
e2 = LA.norm(e2vec) 
nu0 = np.arccos(np.dot(e2vec, np.array([1.0, 0, 0]))/e2) 

#taking the dot product of the vector, specifying the vector location, 
#and pulling the actual coordinate options 

#nupost = (np.arccos(np.dot(r0, e2vec)/(Re * e2)) * 180.0/np.pi)     
#nupost = (np.arccos(r0[0] * e2vec[0]/(Re * e2)) * 180.0/np.pi) 
#nupost = (np.arccos(-Re * 0.30029169/(Re * e2)) * 180.0/np.pi)     

  1. 我檢查了矢量是相同的尺寸,我們有r01x3,所以是e2vec。但是,每當我試圖採取這兩個向量的點積,收到

    ValueError        Traceback (most recent call last) 
    <ipython-input-13-40977131af32> in <module>() 
    ----> 1 execfile(r'/home/dustin/test.py') # PYTHON-MODE 
    
    /home/dustin/test.py in <module>() 
        26 
        27 #nupost = (np.arccos(-Re * 0.30029169/(Re * e2)) * 180.0/np.pi) 
    ---> 28 nupost = (np.arccos(np.dot(r0, e2vec)/(Re * e2)) * 180.0/np.pi) 
        29 #nupost = (np.arccos(r0[0] * e2vec[0]/(Re * e2)) * 180.0/np.pi) 
        30 
    
    ValueError: matrices are not aligned 
    
  2. 然後我試圖指定的矢量分量r0[0]e2vec[0]在所述第一位置,其中乘以這些產生1x3矢量與正確答案。不過,我不應該在這裏接受一個載體。

    In [14]: The eccentricity vector of the new ellipse is [[ 0.30029169 0.14176274 \ 
    0.  ]] 
    The post flyby true anomaly is [ 154.72877834 115.27122166 90.  ] 
    
  3. 如果我只是拉實際值,一切正常。

我不是Python專家,但爲什麼不點產品的情況下,1個工作,爲什麼不指定矢量分量的情況下,2個工作?在我的例子中,我曾經使用過點積矢量組件規範,沒有這樣的問題。

+0

您是否可以在代碼中包含所有變量的聲明?這會幫助你更輕鬆。 –

+0

或更好的是,只刪除除了失敗的行之外的大部分代碼,以及在行之前打印所有涉及的變量。 –

+1

是你的載體1維(形狀'(3,)')還是2維(形狀'(1,3)')? – user2357112

回答

2

看起來好像e2vec是2D形狀(1, 3)。您需要在將它傳遞到np.dot之前將其平坦化,您可以執行以下操作:

nupost = (np.arccos(np.dot(r0, e2vec.ravel())/(Re * e2)) * 180.0/np.pi) 
+0

我對形狀爲(1,3)的形狀(3,)和2D有困惑。矢量都是'1x3',那麼2D的'e2vec'如何? – dustin

+0

形狀'(3,)'的形狀不是1x3,而2d的形狀是1x3x3。 Numpy數組支持任意數量的維度(甚至是0!); 'dot'只是一維數組的點積。 – user2357112

+0

當我在這裏說2D時,我指的是numpy數組中的維數,而不是數學意義上的維數。考慮到這個定義,形狀'(3,)'是1D,形狀'(1,3)'是2D,這就是爲什麼你只需要轉換'e2vec'。 –