简体   繁体   English

使用SymPy对符号矩阵进行对角化

[英]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. 我使用了SymPy diagonalize功能,但是我的代码即使在运行两个小时后也没有完成。 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. 对角化2×2矩阵和4乘4矩阵之间的复杂性存在巨大差异。 In fact, Alistmatrix.eigenvals() returns four eigenvalues, the first of which is: 事实上, Alistmatrix.eigenvals()返回四个特征值,第一个是:

{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. 我无法在此粘贴整个eigenvals输出,因为它超出了Stack Overflow post限制。

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. 因此, eigenvects()随后会窒息,这一点不足为奇,因为它必须为该复杂性的特征值找到特征向量,这些特征值是分段式的。

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? 也许在这里做的正确的事情是退一步问:即使伴随着一个200000字符的特征向量公式,你会用38000个字符的特征值公式做什么? Some problems are just not meant to be solved symbolically. 有些问题并不意味着象征性地解决。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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