我需要用python对象化矩阵进行对角化。在Mathematica中,它可以很容易地完成,但是当使用模块numpy.linalg
时,我会遇到问题。
具体,请考虑矩阵
[[2, x], [x, 3]]
其中x
是一个符号变量。我想我遇到了问题,因为numpy包是为数值计算提供的,而不是符号,但是我找不到如何用sympy来做。
答案 0 :(得分:7)
您可以从特征值计算它,但实际上有一种方法可以帮助您,diagonalize
In [13]: M.diagonalize()
Out[13]:
⎛ ⎡ __________ ⎤⎞
⎜ ⎢ ╱ 2 ⎥⎟
⎜⎡ -2⋅x 2⋅x ⎤ ⎢ ╲╱ 4⋅x + 1 5 ⎥⎟
⎜⎢───────────────── ─────────────────⎥, ⎢- ───────────── + ─ 0 ⎥⎟
⎜⎢ __________ __________ ⎥ ⎢ 2 2 ⎥⎟
⎜⎢ ╱ 2 ╱ 2 ⎥ ⎢ ⎥⎟
⎜⎢╲╱ 4⋅x + 1 - 1 ╲╱ 4⋅x + 1 + 1⎥ ⎢ __________ ⎥⎟
⎜⎢ ⎥ ⎢ ╱ 2 ⎥⎟
⎜⎣ 1 1 ⎦ ⎢ ╲╱ 4⋅x + 1 5⎥⎟
⎜ ⎢ 0 ───────────── + ─⎥⎟
⎝ ⎣ 2 2⎦⎠
M.diagonalize()
返回一对(P, D)
矩阵,M = P*D*P**-1
。如果它不能计算足够的特征值,要么因为矩阵不可对角化,要么因为solve()
找不到特征多项式的所有根,它将引发MatrixError
。
另见SymPy教程的this section。
答案 1 :(得分:2)
假设矩阵是可对角化的,你可以通过
得到特征向量和特征值from sympy import *
x = Symbol('x')
M = Matrix([[2,x],[x,3]])
print M.eigenvects()
print M.eigenvals()
,并提供:
[(-sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(sqrt(4*x**2 + 1)/2 - 1/2)]
[ 1]]), (sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(-sqrt(4*x**2 + 1)/2 - 1/2)]
[ 1]])]
{sqrt(4*x**2 + 1)/2 + 5/2: 1, -sqrt(4*x**2 + 1)/2 + 5/2: 1}
您应该查看documentation,其中列出了许多其他分解。
请注意,并非每个矩阵都是可对角化的,但您可以使用sympy命令.jordan_form
将每个矩阵放入Jordan Normal Form。