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

2024-05-14 20:34:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 方法函数core解决方案blasinstruction特征值特征向量
3条回答

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

但如果你觉得更容易,你可以实现这些http://en.wikipedia.org/wiki/List_of_numerical_analysis_topics#Eigenvalue_algorithms中的任何一个。

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

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

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

相关问题 更多 >

    热门问题