为何Numpy逆矩阵相乘得单位阵,Sympy却无法得到?
问题原因解析
这个差异核心来自数值计算与符号计算的本质区别,具体拆成两点:
Numpy的数值近似特性:
你用np.linalg.eig得到的特征向量本身就是数值近似解(大部分矩阵的特征值/特征向量无法用精确表达式求解,只能靠数值迭代得到近似结果),后续的np.linalg.inv(U)也是基于浮点数的数值逆运算,本身会带有微小精度误差。np.around(U@U_H,0)只是把这些误差截断为0,才显示出单位矩阵——实际上U@U_H本身并非严格的单位矩阵,只是近似值。Sympy的精确符号存储:
当你把Numpy的浮点数矩阵转成Sympy矩阵时,Sympy会精确保留所有浮点数里的微小误差(包括特征向量、逆矩阵中的精度偏差)。矩阵相乘时,Sympy不会像Numpy那样自动忽略或截断这些微小项,而是会把所有精确计算结果完整展开,这些原本被Numpy截断的误差项累加后,就导致结果看起来不是单位矩阵。
另外你提到的“元素级乘法没执行”是误解:Sympy里的*对于矩阵就是矩阵乘法,不是逐元素乘,只是它会把每一项的精确表达式完整展示出来,看起来像是没合并计算而已。
内容的提问来源于stack exchange,提问作者lilted
相关产品推荐
相关产品推荐

