You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

np.linalg.inv()求矩阵逆结果异常,乘积非单位矩阵如何解决

问题原因分析
  • 浮点运算固有精度限制:numpy默认使用双精度浮点数(float64)运算,理论精度上限约为1e-16,你的矩阵中本身就存在大量1e-17量级的极小值,这类值大多是前期运算的舍入残留,在求逆的多步运算中误差会被累积放大,最终得到的乘积结果主对角线为1、非对角线为1e-15~1e-16量级的极小值,属于正常的数值误差范畴,并非求逆逻辑错误。
  • 矩阵条件数过高:你提供的矩阵条件数约为3e16,已经接近float64的精度极限,属于接近奇异的矩阵,这类矩阵求逆时数值稳定性极差,微小的输入误差就会导致输出结果出现极大偏差,是误差偏大的核心原因。
  • np.linalg.inv的实现特性:该函数基于LU分解实现,仅适用于非奇异矩阵,对接近奇异的矩阵兼容性很差,也会放大误差。
排查解决思路
  • 验证误差是否在合理范围:不要直接肉眼判断打印结果,使用np.allclose(M_inv @ M, np.eye(M.shape[0]))做验证,该函数会自动忽略低于阈值的浮点误差,如果返回True则说明结果完全符合预期。如果要更直观观察,可以打印np.round(M_inv @ M, 12),四舍五入后就是标准单位矩阵。
  • 检查矩阵条件数:运行print(np.linalg.cond(M)),如果输出结果大于1e10,说明矩阵接近奇异,首先要排查你构造矩阵的业务逻辑是否正确,是否存在参数输入错误、应该为0的数值被带入了极小舍入值的情况。
  • 替换更稳定的运算方案:
    • 如果你的业务场景是求解线性方程组Mx = b,不要使用inv(M) @ b的实现,直接调用np.linalg.solve(M, b),精度会比先求逆再乘高数个量级。
    • 如果确实需要用到逆矩阵,替换np.linalg.inv为np.linalg.pinv计算Moore-Penrose伪逆,对接近奇异的矩阵兼容性更好。
  • 预处理矩阵减少无效误差:如果矩阵中1e-15以下的数值理论上应该为0,可以先做一步截断处理M[np.abs(M) < 1e-15] = 0,再执行后续运算,能消除一部分不必要的舍入误差。

内容的提问来源于stack exchange,提问作者Eldir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:54:03