我需要在Python中计算特征值和特征向量。NumPy和SciPy都无法使用,它们都写了“非法指令(核心已转储)”的错误信息。我发现解决这个问题需要检查我的blas / lapack。因此,我想也许有更简单的方法是编写/找到一个小函数来解决特征值问题。是否有人知道是否存在这样的解决方案?
我需要在Python中计算特征值和特征向量。NumPy和SciPy都无法使用,它们都写了“非法指令(核心已转储)”的错误信息。我发现解决这个问题需要检查我的blas / lapack。因此,我想也许有更简单的方法是编写/找到一个小函数来解决特征值问题。是否有人知道是否存在这样的解决方案?
您可以使用Python计算机代数系统sympy来使用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 ])