我想计算拉普拉斯矩阵的第二个特征值,以检查相应的图是否已连接,但是当我尝试使用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个特征值的近似值.