3

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

4

3 回答 3

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 ])
于 2013-11-27T11:18:57.320 回答
2

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

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

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

于 2013-10-25T06:23:49.717 回答
0

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

于 2013-10-29T05:37:17.427 回答