Sympy对含sympy.I的符号复矩阵对角化出现NotInvertible报错如何解决
问题结论
你的代码不存在逻辑错误,这是SymPy 1.8版本的已知缺陷:该版本在计算带内置sympy.I的符号厄米矩阵的特征向量时,内部代数化简流程会误将非零表达式判定为零除数,进而抛出NotInvertible错误。你测试的自定义非实数符号替代sympy.I的方法可以绕开该问题,是因为自定义符号不会触发SymPy针对内置虚数单位的特殊化简分支。
解决方案
- 升级SymPy版本:该缺陷在SymPy 1.9及后续版本中已被修复,升级后直接运行原有代码即可正常输出特征向量结果。
- 自定义符号替换后回代:你可以沿用当前测试有效的方案,先使用自定义非实数符号参与计算,得到结果后再替换为标准
sympy.I,参考代码如下:
from sympy import * a, b, c = symbols('a b c', real=True) j = symbols('j') m = Matrix([[a, j * b], [-j * b, c]]) eig_result = m.eigenvects() # 将自定义符号替换回标准虚数单位 processed_eig = [ (eig_val.subs(j, I), mult, [vec.subs(j, I) for vec in eig_vecs]) for eig_val, mult, eig_vecs in eig_result ]
- 分步计算避开缺陷:你也可以先调用
eigenvals()方法得到所有特征值,再对每个特征值手动求解齐次线性方程组得到对应的特征向量,绕开eigenvects()方法的问题逻辑。
内容的提问来源于stack exchange,提问作者hfukuda
相关产品推荐
相关产品推荐

