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

标签 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 进行符号计算,因此 float 可能是一个问题。所以我尝试了:

  1. 降低 float Float(tmp[i][j], 3) 的精度,但没有帮助。
  2. 我曾尝试将 float 转换为 Rational list(map(nsimplify, tmp[i])),但没有帮助。
  3. 我曾尝试将 float 转换为 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×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 个根(特征值 也只产生了 5 个特征值)。 5 个缺失的根是五次方程 s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7 的根。

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

关于python - SymPy 无法计算此矩阵的特征值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50356594/

相关文章:

python - 使用 SymPy 的新假设

python - Sympy 符号矩阵指数

python - 如何解决/检查字符串中的字符是否不是不允许的字符?

python - 使用 python 获取 vnet 的所有属性 |列表函数仅给出名称

python - 使用列表来比较不等长度的字符串

python - Python 程序如何加载并读取文件中的特定行?

math - 如何在 5x5 矩阵中分配 5 位数字

r - 删除 R 中的行标识符

matlab - 如何创建自定义非线性滤波器?

haskell - 求解(两个以上)线性不等式系统