首页 文章

SymPy无法计算此矩阵的特征值

提问于
浏览
3

我想计算拉普拉斯矩阵的第二个特征值,以检查相应的图形是否连接,但是当我尝试使用SymPy的 eigenvals 时,很多时候会发生抛出错误

MatrixError: Could not compute eigenvalues for 
Matrix([[1.00000000000000, 0.0, 0.0, 0.0, -1.00000000000000, 0.0, 0.0, 0.0, 0.0, 0.0], 
        [0.0, 1.00000000000000, 0.0, 0.0, 0.0, -1.00000000000000, 0.0, 0.0, 0.0, 0.0], 
        [0.0, 0.0, 1.00000000000000, 0.0, 0.0, 0.0, 0.0, 0.0, -1.00000000000000, 0.0], 
        [0.0, 0.0, 0.0, 1.00000000000000, 0.0, 0.0, 0.0, 0.0, -1.00000000000000, 0.0], 
        [-1.00000000000000, 0.0, 0.0, 0.0, 1.00000000000000, 0.0, 0.0, 0.0, 0.0, 0.0], 
        [0.0, -1.00000000000000, 0.0, 0.0, 0.0, 3.00000000000000, 0.0, 0.0, -1.00000000000000, -1.00000000000000], 
        [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], 
        [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.00000000000000, 0.0, -1.00000000000000], 
        [0.0, 0.0, -1.00000000000000, -1.00000000000000, 0.0, -1.00000000000000, 0.0, 0.0, 3.00000000000000, 0.0], 
        [0.0, 0.0, 0.0, 0.0, 0.0, -1.00000000000000, 0.0, -1.00000000000000, 0.0, 2.00000000000000]])

环顾四周,我发现由于SymPy进行了符号计算,因此浮点可能是一个问题 . 所以我尝试过:

  • 要降低浮点 Float(tmp[i][j], 3) 的精度,但它没有帮助 .

  • 我试图将浮动转换为Rational list(map(nsimplify, tmp[i])) ,但它没有帮助 .

  • 我试图将浮动转换为int list(map(int, tmp[i])) ,但它也没有帮助 .

即使我将每个元素转换为 int ,我真的可以't understand why it doesn' t .

1 回答

  • 3

    由于拉普拉斯算子是一个整数矩阵,让我们使用整数:

    L = Matrix([[ 1,  0,  0,  0, -1,  0, 0,  0,  0,  0],
                [ 0,  1,  0,  0,  0, -1, 0,  0,  0,  0],
                [ 0,  0,  1,  0,  0,  0, 0,  0, -1,  0],
                [ 0,  0,  0,  1,  0,  0, 0,  0, -1,  0],
                [-1,  0,  0,  0,  1,  0, 0,  0,  0,  0],
                [ 0, -1,  0,  0,  0,  3, 0,  0, -1, -1],
                [ 0,  0,  0,  0,  0,  0, 0,  0,  0,  0],
                [ 0,  0,  0,  0,  0,  0, 0,  1,  0, -1],
                [ 0,  0, -1, -1,  0, -1, 0,  0,  3,  0],
                [ 0,  0,  0,  0,  0, -1, 0, -1,  0,  2]])
    

    计算 eigenvalues

    >>> L.eigenvals()
    {0: 3, 1: 1, 2: 1}
    

    这很奇怪,因为矩阵是10乘10,而不是5乘5 .

    我试图计算Jordan正常形式,但无法做到,因为函数 jordan_form 产生了错误消息 IndexError: list index out of range .

    计算 characteristic polynomial

    >>> s = Symbol('s')
    >>> p = (s * eye(10) - L).det()
    >>> p
    s**10 - 14*s**9 + 77*s**8 - 214*s**7 + 321*s**6 - 256*s**5 + 99*s**4 - 14*s**3
    

    注意,最低度的单项式是立方的 . 这使我们得出结论:特征值0的多重性为3,因此,该图是 not connected .

    让我们试着找到特征多项式的 roots

    >>> solve(p,s)
    [0, 0, 0, 1, 2, CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 0), CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 1), CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 2), CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 3), CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 4)]
    

    请注意,实际上只发现了5个根( eigenvals 也只产生了5个特征值) . 5个缺失的根是quintic s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7 的根源 .

    自19世纪以来就已经知道,并非所有5级(或更高级)的多项式都具有可以使用算术运算和自由基表达的根 . 因此,我们可能会要求SymPy做 impossible . 更好地使用NumPy来计算10个特征值的近似值 .

相关问题