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

11

我希望能通过以下方式计算系统A的特征向量xAx=λ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个回答

9
使用 eigenvalseigenvects 方法通常用于这里。 A.eigenvals() 返回字典形式的特征值和它们的重数,例如: {-sqrt(17)/2 - 3/2: 1, -3/2 + sqrt(17)/2: 1}。如果您不在乎特征值的重数,可以使用 list(A.eigenvals().keys()) 获取特征值的列表形式。 eigenvects 的输出有些复杂,由三元组(特征值、特征值的重数、特征空间的基)组成。请注意,“重数”是代数重数,而返回的特征向量的数量是几何重数,可能会更小。由于某种原因,特征向量以 1 列矩阵的形式返回。
对于您的矩阵,A.eigenvects() 返回特征值为 -3/2 + sqrt(17)/2 时的特征向量 [-2/(-sqrt(17)/2 + 3/2), 1],返回特征值为 -sqrt(17)/2 - 3/2 时的特征向量 [-2/(3/2 + sqrt(17)/2), 1]
如果您希望将特征向量呈现为坐标列表,请使用以下方法:
[list(tup[2][0]) for tup in A.eigenvects()]

会输出 [[-2/(-sqrt(17)/2 + 3/2), 1], [-2/(3/2 + sqrt(17)/2), 1]]。(请注意,这只是为每个特征值选择了一个特征向量,这并不总是您想要的结果)


嗨!是的,我知道如何使用内置函数获取特征向量。但是如果我想使用求解功能。就像你看到的那样,它对我来说不起作用。我无法计算出x1和x2,这就是特征向量。 - euraad
上述代码并不总是有效的,例如对于这个矩阵,它有3个特征向量,而上面的代码只显示了其中2个。A = Matrix([ [4, 0, 1], [2, 3, 2], [1, 0, 4] ]) - Mohammed
这行代码对我来说效果最好 sym_eignvects = [] for tup in sMatrix.eigenvects(): for v in tup[2]: sym_eignvects.append(list(v)) - Mohammed

7

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
[T, D] = A.diagonalize() 是 SymPy 中更好的方法。 - euraad

0

这个答案将帮助你,当你需要所有的特征向量时,上面的解决方案不总是给出所有的特征向量,例如下面使用的矩阵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))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接