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

2024-09-29 00:21:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算拉普拉斯矩阵的第二个特征值来检查对应的图是否连通,但是当我尝试使用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做符号计算,浮点可能是一个问题。所以我试着:

  1. 以降低浮点Float(tmp[i][j], 3)的精度,但没有帮助。在
  2. 我尝试过将float转换成Rationallist(map(nsimplify, tmp[i])),但是没有用。在
  3. 我尝试过将float转换为intlist(map(int, tmp[i])),但这都没用。在

我真的不明白为什么它不起作用,即使我把每个元素都转换成int。在


Tags: map错误not矩阵floattmpcouldint
1条回答
网友
1楼 · 发布于 2024-09-29 00:21:35

由于拉普拉斯是一个整数矩阵,所以我们使用整数:

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]])

计算特征值:

^{pr2}$

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

我试图计算Jordan范式,但无法计算,因为函数jordan_form产生了错误消息IndexError: list index out of range。在

计算特征多项式:

>>> 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,因此,图不连通。在

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

>>> 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个缺失的根是五次方的根{}。在

从19世纪开始,人们就知道并不是所有5次(或更高)的多项式都有可以用算术运算和根来表示的根。因此,我们可能会要求SymPy做不可能的事。最好使用NumPy来计算10个特征值的近似值。在

相关问题 更多 >