Python求解矩阵方程组结果异常,y[0]、y[2]为何非预期0值?
浮点数精度误差导致的极小值现象
这是数值计算里非常常见的情况,本质上你得到的y[0]和理论值0是完全等价的,不用太担心!
先理清楚理论解和计算结果的对应
你的方程组是A @ y = X,拆解来看:
- 第一个方程:
1*y[0] + 0*y[1] + 0*y[2] = -0.→ 理论上y[0] = 0 - 第三个方程:
0*y[0] + 0*y[1] + 1*y[2] = 0.→ 理论上y[2] = 0 - 第二个方程:
-9*y[0] +28*y[1] -9*y[2] = -0.125→ 代入前两个解,得到y[1] = -0.125/28 ≈ -0.00446428571,这和你计算出的y[1]完全一致。
为什么y[0]不是精确的0?
这是二进制浮点数的固有精度限制导致的舍入误差:
- 计算机里所有浮点数都是用二进制存储的,很多十进制的数(哪怕是0.1这种简单的小数)都没法被二进制精确表示,只能近似。
numpy.linalg.solve内部会执行一系列矩阵分解和数值计算,过程中微小的误差会被积累,最终导致本应是0的位置出现一个极小的非零值(-1.92747053e-18的绝对值约等于2^-59,远小于单精度/双精度浮点数的精度阈值)。
而y[2]刚好显示为0,只是因为这个位置的误差小到被numpy的默认输出格式截断了,本质上和y[0]的情况是一样的(你可以尝试打印更精确的位数,可能也会看到极小的非零值)。
怎么处理这种情况?
- 判断数值等价:用
np.isclose(y[0], 0)来检查,这个函数会考虑浮点数的精度范围,返回True,说明这个值在数值上和0没有区别。 - 优化输出显示:执行
np.set_printoptions(suppress=True)后再打印结果,numpy会把极小的浮点数直接显示为0,更符合你的预期。
内容的提问来源于stack exchange,提问作者Andrew98
相关产品推荐
相关产品推荐

