2013-10-25 185 views
1

我需要計算python中的特徵值和特徵向量。 numpy和scipy不起作用。他們都寫Illegal instruction (core dumped)。我發現要解決這個問題,我需要檢查我的blas/lapack。所以,我認爲可能更簡單的方法是編寫/尋找解決特徵值問題的小函數。有誰知道這種解決方案是否存在?如何找到沒有numpy和scipy的特徵向量和特徵值?

+0

有不止一個方法,但你們中的大多數最終會執行矩陣分解/角化和沒有用於數值計算像樣的圖書館,很難做一個簡明的時間辦法。此外,每個簡單的方法都是有條件的,沒有一些優化,就不能保證你會得到甚至遠離真正解決方案的東西。 – zero323

+0

我也想爲此解決方案。我必須計算小矩陣的特徵值(4x4),所以速度不是一個大問題。我不能使用numpy/scipy(由於技術原因,無法安裝它),但僅限於純python。我寧願不自己實現一個算法(我也可以在紙上解決它,只是實現所得到的方程!)。必須有一個簡單的片段! – jdm

回答

0

編寫一個解決特徵值問題的程序大約是修復庫不匹配問題的100倍。

2

您可以使用sympy(python計算機代數系統)在不使用本機庫的情況下使用Berkowitz方法解決特徵值問題。這並不快,但如果你有少量的小矩陣,那就不成問題了。

例子:

>>> from sympy import Matrix 
>>> m = Matrix([[10,2,3], [3,12,5], [5,5,8]]) 
>>> print m.eigenvals() 
# this gets the eigenvalues along with their multiplicity 
{10 - (-77/2 + sqrt(1019751)*I/18)**(1/3) - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)): 1, 
10 - (-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 + sqrt(3)*I/2) - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 + sqrt(3)*I/2)): 1, 
10 - 50/(3*(-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 - sqrt(3)*I/2)) - (-77/2 + sqrt(1019751)*I/18)**(1/3)*(-1/2 - sqrt(3)*I/2): 1} 
>>> print map(complex, m.eigenvals().keys()) 
[(8.374025140524024+2.117582368135751e-22j), (3.8835463038416105-2.117582368135751e-22j), (17.742428555634365-1.0587911840678754e-22j)] 

# check with numpy 
>>> import numpy as np 
>>> print np.linalg.eigvals(np.array(m.tolist(), dtype=float)) 
array([ 17.74242856, 8.37402514, 3.8835463 ]) 
+0

謝謝,它的作品!我實際上設法安裝numpy(通過過時的python和library版本的處理),但下次這可能會很方便。 – jdm

相關問題