简体   繁体   中英

Diagonalizing a symbolic matrix using SymPy

I have a symbolic matrix that I would like to diagonalize to find its eigenvalues. I used the SymPy diagonalize function, but my code doesnt complete even after running for two hours. No error is given, it just doesn't terminate. This example uses the similar protocol but completes immediately. Does anybody know why this would not complete?

import sympy
from sympy import Symbol
from sympy import *

J1 = Symbol('J1')
J2= Symbol('J2')
S1 = Symbol('S1')
S2 = Symbol('S2')
S3 = Symbol('S3')
S4 = Symbol('S4')

Alistmatrix=sympy.Matrix([[0, -2*J1*S1*S2, -J2*S1*S3, 0],
[-2*J1*S1*S2, 0, -2*J1*S2*S3, -J2*S2*S4],
[-J2*S1*S3, -2*J1*S2*S3, 0, -2*J1*S3*S4],
[0, -J2*S2*S4, -2*J1*S3*S4, 0]])


print (Alistmatrix.eigenvects())
print (Alistmatrix.eigenvals())

There is a huge difference in complexity between diagonalizing a 2 by 2 matrix and a 4 by 4 matrix. In fact, Alistmatrix.eigenvals() returns four eigenvalues, the first of which is:

{Piecewise((-sqrt(8*J1**2*S1**2*S2**2/3 + 8*J1**2*S2**2*S3**2/3 + 8*J1**2*S3**2*S4**2/3 + 2*J2**2*S1**2*S3**2/3 + 2*J2**2*S2**2*S4**2/3 - 2*(-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**(1/3))/2 + sqrt(16*J1**2*S1**2*S2**2/3 + 16*J1**2*S2**2*S3**2/3 + 16*J1**2*S3**2*S4**2/3 + 4*J2**2*S1**2*S3**2/3 + 4*J2**2*S2**2*S4**2/3 + (16*J1**2*J2*S1**2*S2**2*S3**2 + 16*J1**2*J2*S2**2*S3**2*S4**2)/sqrt(8*J1**2*S1**2*S2**2/3 + 8*J1**2*S2**2*S3**2/3 + 8*J1**2*S3**2*S4**2/3 + 2*J2**2*S1**2*S3**2/3 + 2*J2**2*S2**2*S4**2/3 - 2*(-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**(1/3)) + 2*(-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**(1/3))/2, Eq(-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12, 0)), (-sqrt(8*J1**2*S1**2*S2**2/3 + 8*J1**2*S2**2*S3**2/3 + 8*J1**2*S3**2*S4**2/3 + 2*J2**2*S1**2*S3**2/3 + 2*J2**2*S2**2*S4**2/3 - 2*(-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)/(3*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3)) + 2*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3))/2 + sqrt(16*J1**2*S1**2*S2**2/3 + 16*J1**2*S2**2*S3**2/3 + 16*J1**2*S3**2*S4**2/3 + 4*J2**2*S1**2*S3**2/3 + 4*J2**2*S2**2*S4**2/3 + (16*J1**2*J2*S1**2*S2**2*S3**2 + 16*J1**2*J2*S2**2*S3**2*S4**2)/sqrt(8*J1**2*S1**2*S2**2/3 + 8*J1**2*S2**2*S3**2/3 + 8*J1**2*S3**2*S4**2/3 + 2*J2**2*S1**2*S3**2/3 + 2*J2**2*S2**2*S4**2/3 - 2*(-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)/(3*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3)) + 2*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3)) + 2*(-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)/(3*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3)) - 2*((8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/16 + sqrt((-(8*J1**2*J2*S1**2*S2**2*S3**2 + 8*J1**2*J2*S2**2*S3**2*S4**2)**2/8 + (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/3 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/108)**2/4 + (-16*J1**4*S1**2*S2**2*S3**2*S4**2 + 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 - J2**4*S1**2*S2**2*S3**2*S4**2 - (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**2/12)**3/27) - (16*J1**4*S1**2*S2**2*S3**2*S4**2 - 8*J1**2*J2**2*S1**2*S2**2*S3**2*S4**2 + J2**4*S1**2*S2**2*S3**2*S4**2)*(-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)/6 + (-4*J1**2*S1**2*S2**2 - 4*J1**2*S2**2*S3**2 - 4*J1**2*S3**2*S4**2 - J2**2*S1**2*S3**2 - J2**2*S2**2*S4**2)**3/216)**(1/3))/2, True)): 1, ...

Scroll to the right to fully appreciate this formula. I could not paste the entire output of eigenvals here, as it exceeds the Stack Overflow post limit.

So it's little surprise that eigenvects() subsequently chokes, as it has to find eigenvectors for eigenvalues of that complexity, which are Piecewise on top of all.

Perhaps the right thing to do here is to step back and ask: what would you do with a 38000-character formula for eigenvalues even if it was accompanied by a 200000-character formula for eigenvectors? Some problems are just not meant to be solved symbolically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM