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

Python 如何在没有numpy和scipy的情况下找到特征向量和特征值?,python,linear-algebra,Python,Linear Algebra,我需要用python计算特征值和特征向量。numpy和scipy不起作用。它们都写非法指令(内核转储)。我发现要解决这个问题,我需要检查我的blas/lapack。所以,我认为可能更简单的方法是编写/找到一个小函数来解决特征值问题。有人知道是否存在这样的解决方案吗?任何有效的解决方案都会在内部使用相同的blas/lapack库。我仍然认为修复你的LIB不会那么难 但是,如果你觉得更容易,你可以自己实现其中的任何一个 我认为最容易实现的是,但怀疑它是否有效。编写一个程序来解决特征值问题的工作量大约

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

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

但是,如果你觉得更容易,你可以自己实现其中的任何一个


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

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

您可以使用python计算机代数系统Symphy来解决特征值问题,而无需使用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 ])

有不止一种方法,但大多数情况下,您最终会执行矩阵分解/对角化,并且没有合适的数值计算库,很难以简洁的方式完成。此外,每一个简单的方法都是病态的,如果没有一些优化,就不能保证你得到的东西甚至是非常接近真实的解决方案。我也想要一个解决方案。我必须计算小矩阵(4x4)的特征值,所以速度不是大问题。我不能使用numpy/scipy(由于我无法控制的技术原因,无法安装它),只能使用纯python。我不想自己实现一个算法(我也可以在纸上解决它,然后实现得到的方程!)。一定有一个简单的片段!谢谢,它很管用!事实上,我还是设法安装了numpy(在我必须处理的过时python和库版本的混乱中),但下一次这可能会很方便。