【发布时间】:2018-10-25 15:57:17
【问题描述】:
我想计算一个拉普拉斯矩阵的第二个特征值来检查对应的图是否连通,但是当我尝试使用 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])),但没有帮助。 - 我尝试将浮点数转换为 int
list(map(int, tmp[i])),但也没有用。
我真的不明白为什么它不起作用,即使我将每个元素都转换为int。
【问题讨论】:
-
你确定矩阵有真正的特征值吗?
-
如果你对特征值的浮点计算没问题,你应该更喜欢 numpy 或 scipy 例程。例如,
scipy.linalg.eig(或者,更好的是,scipy.linalg.eigh,因为矩阵是厄米特矩阵)识别特征值没有问题 -
@internet_user 我确信矩阵有真正的特征值。 @Stelios 我已经看过
scipy.linalg.eigh,但我不确定特征值的精度,因为我需要准确知道第二小的特征值是否大于或等于零。你认为scipy.linalg.eigh执行的数值计算总能让我检索到这些正确信息吗? -
从拉普拉斯矩阵的第 7 行/第 7 列只有零这一事实可以得出图不连通的结论。
标签: python matrix sympy symbolic-math eigenvalue