繁体   English   中英

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

[英]How to find the eigenvalues and eigenvectors of a matrix with SymPy?

我想通过使用这个来计算系统A的特征向量xA 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)))

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM