如何用SymPy找到矩阵的特征值和特征向量?

时间:2017-04-28 21:22:36

标签: python matrix system sympy

我想通过使用以下方法从系统 A 计算特征向量 x A x = < em>λ 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)))

3 个答案:

答案 0 :(得分:4)

方法eigenvalseigenvects是人们通常在这里使用的方法。

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))