Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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())
like image 334
notAI Avatar asked Jan 01 '26 09:01

notAI


1 Answers

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.


Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!