2024-06-28 15:59:51 发布
网友
我需要用python对角化一个符号矩阵。在Mathematica中,这很容易实现,但是当使用模块numpy.linalg时,我会遇到问题。
numpy.linalg
对于具体性,考虑矩阵
[[2, x], [x, 3]]
其中x是符号变量。我想我会遇到问题,因为numpy包是为数值计算而提供的,而不是符号计算,但是我找不到如何使用sympy。
x
你可以根据特征值来计算,但实际上有一种方法可以帮你计算,^{}
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。
M.diagonalize()
(P, D)
M = P*D*P**-1
solve()
MatrixError
另请参见SymPy教程的this section。
假设矩阵是对角化的,你可以通过
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 Normal Form。
你可以根据特征值来计算,但实际上有一种方法可以帮你计算,^{}
M.diagonalize()
返回一对矩阵(P, D)
,这样M = P*D*P**-1
。如果它不能计算足够的特征值,或者是因为矩阵不可对角化,或者是因为solve()
不能找到特征多项式的所有根,那么它将提高MatrixError
。另请参见SymPy教程的this section。
假设矩阵是对角化的,你可以通过
给予:
您应该查看documentation,这里列出了许多其他分解。
注意,并不是每个矩阵都可以对角化,但是可以使用sympy命令将每个矩阵放入Jordan Normal Form。
相关问题 更多 >
编程相关推荐