我想通过使用以下方法从系统 A 计算特征向量 x : A x = < em>λ x
问题是我不知道如何使用SymPy来解决特征值。
这是我的代码。我想从矩阵A
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)))
答案 0 :(得分:4)
方法eigenvals
和eigenvects
是人们通常在这里使用的方法。
A.eigenvals()
返回{-sqrt(17)/2 - 3/2: 1, -3/2 + sqrt(17)/2: 1}
,它是特征值及其多重性的字典。如果您不关心多重性,请使用list(A.eigenvals().keys())
获取特征值的简单列表。
eigenvects
的输出有点复杂,由三元组(特征值,此特征值的多重性,本征空间的基础)组成。请注意,多重性为algebraic multiplicity,而返回的特征向量的数量为geometric multiplicity,可能更小。由于某种原因,特征向量作为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]]
。 (注意这只是为每个特征值选择一个特征向量,这并不总是你想要的)
答案 1 :(得分:4)
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
答案 2 :(得分:0)
当您使用所有特征向量时,此答案将为您提供帮助,上面的解决方案并不总是为您提供所有eienvectos,例如下面使用的矩阵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))