SymPy 无法计算此矩阵的特征值
SymPy could not compute the eigenvalues of this matrix
我想计算拉普拉斯矩阵的第二个特征值来检查相应的图是否连通,但是当我尝试使用 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(tmp[i][j], 3)
,但没有用。
- 我曾尝试将浮点数转换为 Rational
list(map(nsimplify, tmp[i]))
,但没有帮助。
- 我曾尝试将浮点数转换为整数
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 个根(eigenvals
也只产生了 5 个特征值)。 5个缺失的根是五次s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7
.
的根
自 19 世纪以来人们就知道,并非所有 5 次(或更高次)多项式的根都可以用算术运算和根表示。因此,我们可能要求 SymPy 完成不可能。最好使用 NumPy 计算 10 个特征值的近似值。
在增加 maxsteps
参数后,您可以使用 nroots
获得特征多项式所有 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]
来自 solve(p, s)
的 CRootOf
个实例实际上也是解决方案,可以用数值计算:
>>> CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 0).n(2)
0.32
我想计算拉普拉斯矩阵的第二个特征值来检查相应的图是否连通,但是当我尝试使用 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(tmp[i][j], 3)
,但没有用。 - 我曾尝试将浮点数转换为 Rational
list(map(nsimplify, tmp[i]))
,但没有帮助。 - 我曾尝试将浮点数转换为整数
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 个根(eigenvals
也只产生了 5 个特征值)。 5个缺失的根是五次s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7
.
自 19 世纪以来人们就知道,并非所有 5 次(或更高次)多项式的根都可以用算术运算和根表示。因此,我们可能要求 SymPy 完成不可能。最好使用 NumPy 计算 10 个特征值的近似值。
在增加 maxsteps
参数后,您可以使用 nroots
获得特征多项式所有 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]
来自 solve(p, s)
的 CRootOf
个实例实际上也是解决方案,可以用数值计算:
>>> CRootOf(s**5 - 11*s**4 + 42*s**3 - 66*s**2 + 39*s - 7, 0).n(2)
0.32