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

时间:2013-10-25 06:02:11

标签: python linear-algebra

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

3 个答案:

答案 0 :(得分:2)

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

但是如果你发现它更容易,你可以自己实现http://en.wikipedia.org/wiki/List_of_numerical_analysis_topics#Eigenvalue_algorithms中的任何一个。

我认为最容易实现的是power algorithm,但怀疑它是否有效。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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