编程语言
首页 > 编程语言> > python-SymPy无法计算此矩阵的特征值

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

作者:互联网

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

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,我也真的不明白为什么它不起作用.

解决方法:

由于拉普拉斯运算符是整数矩阵,让我们使用整数:

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 x 10,而不是5 x 5.

我尝试计算Jordan范式,但无法执行,因为函数jordan_form产生错误消息IndexError:列表索引超出范围.

计算特征多项式:

>>> 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个根(特征值也仅产生5个特征值).这5个缺失的根是五阶s ** 5-11 * s ** 4 42 * s ** 3-66 * s ** 2 39 * s-7的根.

自19世纪以来,人们就知道并非所有5级(或更高)的多项式都具有可以使用算术运算和部首表示的根.因此,我们可能会要求SymPy做不可能的事情.最好使用NumPy计算10个特征值的近似值.

标签:eigenvalue,matrix,sympy,symbolic-math,python
来源: https://codeday.me/bug/20191109/2011013.html