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

时间:2018-05-15 17:59:51

标签: python matrix sympy symbolic-math eigenvalue

我想计算拉普拉斯矩阵的第二个特征值来检查相应的图是否连接,但是当我尝试使用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. 我试图将浮动转换为Rational list(map(nsimplify, tmp[i])),但它没有帮助。
  3. 我尝试将浮动转换为int list(map(int, tmp[i])),但它也没有帮助。
  4. 即使我将每个元素都转换为int,我也无法理解为什么它没有成功。

2 个答案:

答案 0 :(得分: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]])

计算特征值

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

这是非常奇怪的,因为矩阵是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个缺失的根是五次s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7的根。

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

答案 1 :(得分:0)

在增加 nroots 参数后,您可以使用 maxsteps 获得特征多项式的所有 10 个根的数值近似值:

>>> p = s**10 - 14*s**9 + 77*s**8 - 214*s**7 + 321*s**6 - 256*s**5 + 99*s**4 - 14*s**3
>>> [i.n(2) for i in nroots(eq,maxsteps=100)]
[0, 0, 0, 0.32, 0.68, 1.0, 2.0, 2.1, 3.2, 4.6]

CRootOf 中的 solve(p, s) 实例实际上也是可以数值计算的解:

>>> CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 0).n(2)
0.32