2013-10-25 187 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

相关问题