4

我需要用 python 对角化一个符号矩阵。在 Mathematica 中它可以很容易地完成,但是在使用该模块时numpy.linalg我遇到了问题。

具体来说,考虑矩阵

[[2, x], [x, 3]]

其中x是一个符号变量。我想我遇到了问题,因为 numpy 包是为数值计算提供的,而不是符号的,但我找不到如何用 sympy 来做。

4

2 回答 2

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 教程的这一部分

于 2013-09-09T22:09:54.717 回答
3

假设矩阵是可对角化的,则可以通过以下方式获得特征向量和特征值

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}

您应该查看文档,那里列出了许多其他分解。

请注意,并非每个矩阵都是可对角化的,但您可以使用 sympy 命令将每个矩阵放入Jordan 范式.jordan_form

于 2013-09-09T19:35:51.840 回答