Diagonalize symbolic matrix Diagonalize symbolic matrix numpy numpy

Diagonalize symbolic matrix


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.


Assuming the matrix is diagonalizable, you can get the eigenvectors and eigenvalues by

from sympy import *x = Symbol('x')M = Matrix([[2,x],[x,3]])print M.eigenvects()print M.eigenvals()

Giving:

[(-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}

You should check out the documentation, there are many other decompositions listed there.

Note that not every matrix is diagonalizable, but you can put every matrix into Jordan Normal Form using the sympy command .jordan_form.