如何在没有 numpy 和 scipy 的情况下找到特征向量和特征值



我需要在python中计算特征值和特征向量。 numpy 和 scipy 不起作用。他们都写Illegal instruction (core dumped).我发现要解决问题,我需要检查我的blas/lapack。所以,我认为可能更简单的方法是编写/找到一个小函数来解决特征值问题。有谁知道是否存在这样的解决方案?

任何有效的解决方案都会在内部使用相同的blas/lapack库。我仍然认为修复您的库不会那么难。

但是,如果您发现它更容易,则可以自己实现任何这些 http://en.wikipedia.org/wiki/List_of_numerical_analysis_topics#Eigenvalue_algorithms。

我想最容易实现的是幂算法,但怀疑它会有效。

您可以使用 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 ])

编写一个程序来解决特征值问题大约是修复库不匹配问题的 100 倍。

相关内容

最新更新