Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Diagonalize symbolic matrix

I need to diagonalize a symbolic matrix with python. In Mathematica it can be done easily, but when using the module numpy.linalg I get problems.

For concreteness, consider the matrix

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

where x is a symbolic variable. I guess I get problems because the numpy package is provided for numerical computations, not symbolic, but I cannot find how to do it with sympy.

like image 926
dapias Avatar asked Dec 25 '22 21:12

dapias


1 Answers

You can compute it from the eigenvalues, but there is actually a method that will do it for you, 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() returns a pair of matrices (P, D) such that M = P*D*P**-1. If it can't compute enough eigenvalues, either because the matrix is not diagonalizable or because solve() can't find all the roots of the characteristic polynomial, it will raise MatrixError.

See also this section of the SymPy tutorial.

like image 64
asmeurer Avatar answered Dec 28 '22 13:12

asmeurer