2012-08-02 124 views
4

試圖使用scipy的linalg.eig來解決廣義特徵值問題。然後我檢查我得到的解決方案,它似乎沒有正確的特徵向量返回。另外,文檔建議返回的矢量是標準化的,情況並非如此(儘管這並不會影響我)。用於廣義特徵值的Python eig不返回正確的特徵向量

下面是樣品基質:

>>> a 
array([[ 2.05630374e-01, 8.89584493e-10, -1.46171715e-06], 
     [ 8.89584493e-10, 2.38374743e-02, 9.43440334e-06], 
     [ -1.46171715e-06, 9.43440334e-06, 1.39685787e-02]]) 
>>> b 
array([[ 0.22501692, -0.07509864, -0.05774453], 
     [-0.07509864, 0.02569336, 0.01976284], 
     [-0.05774453, 0.01976284, 0.01524993]]) 

運行EIG我得到:

>>> w,v = linalg.eig(a,b) 
>>> w 
array([ 3.08431414e-01+0.j, 5.31170281e+01+0.j, 6.06298605e+02+0.j]) 
>>> v 
array([[-0.26014092, -0.46277857, -0.0224057 ], 
     [ 0.76112351, -0.59384527, -0.83594841], 
     [ 1.  , -1.  , 1.  ]]) 

,然後測試結果:

>>> a*v[:,0] 
array([[ -5.34928750e-02, 6.77083674e-10, -1.46171715e-06], 
     [ -2.31417329e-10, 1.81432622e-02, 9.43440334e-06], 
     [ 3.80252446e-07, 7.18074620e-06, 1.39685787e-02]]) 
>>> w[0]*b*v[:,0] 
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j], 
     [ 0.00602559-0.j, 0.00603163+0.j, 0.00609548+0.j], 
     [ 0.00463317-0.j, 0.00463941+0.j, 0.00470356+0.j]]) 

我認爲那兩個人將是平等的,但他們不是......我也嘗試過使用eigh而不是成功。將不勝感激任何幫助,我明顯失去了一些東西。

+0

?我很驚訝,因爲eig應該返回3個數組! – 2012-08-02 14:40:56

+0

使用0.10.1。如果我理解正確,默認情況下只返回正確的特徵向量,請參見:http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig.html,因此只返回兩個數組 – nickb 2012-08-02 14:49:42

回答

5

通過查看輸出的形狀可以看到發生了什麼。你的a*v[:,0]應該給一個向量,所以你爲什麼得到一個3x3陣列?答案:因爲你沒有進行矩陣乘法,所以你正在做組件式數組乘法。

督察,你做

>>> a * v[:,0] 
array([[ -5.34928759e-02, 6.77083679e-10, -1.46171715e-06], 
     [ -2.31417334e-10, 1.81432623e-02, 9.43440334e-06], 
     [ 3.80252453e-07, 7.18074626e-06, 1.39685787e-02]]) 
>>> w[0] * b * v[:,0] 
array([[-0.01805437+0.j, -0.01762974+0.j, -0.01781023+0.j], 
     [ 0.00602559-0.j, 0.00603163+0.j, 0.00609548+0.j], 
     [ 0.00463317-0.j, 0.00463941+0.j, 0.00470356+0.j]]) 

當你真的想

>>> a.dot(v[:,0]) 
array([-0.05349434, 0.0181527 , 0.01397614]) 
>>> w[0] * b.dot(v[:,0]) 
array([-0.05349434+0.j, 0.01815270+0.j, 0.01397614+0.j]) 

>>> matrix(a)*matrix(v[:,0]).T 
matrix([[-0.05349434], 
     [ 0.0181527 ], 
     [ 0.01397614]]) 
>>> w[0]*matrix(b)*matrix(v[:,0]).T 
matrix([[-0.05349434+0.j], 
     [ 0.01815270+0.j], 
     [ 0.01397614+0.j]]) 
您正在使用什麼版本的SciPy的
+0

謝謝!任何想法爲什麼特徵向量未被標準化? – nickb 2012-08-02 16:03:26

+0

它看起來像我*他們* *歸一化:每個向量的最大絕對值是1.這可能不是你期望的規範化,但它*是*規範化..:^) – DSM 2012-08-02 16:14:18

+0

規範化直接來來自LAPACK:http://www.netlib.org/lapack/double/dggev.f – 2012-08-03 09:09:26