[英]How to find the eigenvalues and eigenvectors of a matrix with SymPy?
我想通过使用这个来计算系统A的特征向量x : A x = λ x
问题是我不知道如何使用 SymPy 来解决特征值。 这是我的代码。 我想从矩阵A
获取 x1 和 x2 的一些值
from sympy import *
x1, x2, Lambda = symbols('x1 x2 Lambda')
I = eye(2)
A = Matrix([[0, 2], [1, -3]])
equation = Eq(det(Lambda*I-A), 0)
D = solve(equation)
print([N(element, 4) for element in D]) # Eigenvalus in decimal form
print(pretty(D)) # Eigenvalues in exact form
X = Matrix([[x1], [x2]]) # Eigenvectors
T = A*X - D[0]*X # The Ax = %Lambda X with the first %Lambda = D[0]
print(pretty(solve(T, x1, x2)))
eigenvals
和eigenvects
方法是人们通常在这里使用的方法。
A.eigenvals()
返回{-sqrt(17)/2 - 3/2: 1, -3/2 + sqrt(17)/2: 1}
这是一个特征值及其多重性的字典。 如果您不关心多重性,请使用list(A.eigenvals().keys())
来获得一个简单的特征值列表。
eigenvects
的输出稍微复杂一些,由三元组(特征值、该特征值的重数、特征空间的基)组成。 请注意,多重性是代数多重性,而返回的特征向量数是几何多重性,可能会更小。 由于某种原因,特征向量作为 1 列矩阵返回......
对于您的矩阵, A.eigenvects()
返回特征向量[-2/(-sqrt(17)/2 + 3/2), 1]
的特征值-3/2 + sqrt(17)/2
和特征向量[-2/(3/2 + sqrt(17)/2), 1]
对于特征值-sqrt(17)/2 - 3/2
。
如果您希望将特征向量表示为简单的坐标列表,请执行以下操作
[list(tup[2][0]) for tup in A.eigenvects()]
将输出[[-2/(-sqrt(17)/2 + 3/2), 1], [-2/(3/2 + sqrt(17)/2), 1]]
。 (注意这只是为每个特征值选择一个特征向量,这并不总是你想要的)
sympy 有一种非常方便的获取特征值和特征向量的方法: sympy-doc
您的示例将简单地变为:
from sympy import *
A = Matrix([[0, 2], [1, -3]])
print(A.eigenvals()) #returns eigenvalues and their algebraic multiplicity
print(A.eigenvects()) #returns eigenvalues, eigenvects
当您使用所有 eignvectors 时,此答案将对您有所帮助,上面的解决方案并不总是为您提供所有 eignectos,例如下面使用的矩阵 A
# the matrix
A = Matrix([
[4, 0, 1],
[2, 3, 2],
[1, 0, 4]
])
sym_eignvects = []
for tup in sMatrix.eigenvects():
for v in tup[2]:
sym_eignvects.append(list(v))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.