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

Python中3x3矩阵回代求解问题:x1结果异常排查

排查你的上三角矩阵回代法问题

首先,我们拆解下你的问题:你的代码逻辑本身是正确的,但你看到x1=0的结果大概率是没有正确获取函数返回值导致的,另外你的预期结果也存在错误。

1. 为什么你看到x1=0?

你的back_sub函数会正确计算出解并返回,但如果调用函数时没有将返回值赋值给变量,而是直接打印了之前定义的初始x(比如你在函数外提前定义过x = [0]*3),那自然会看到x1=0。举个错误调用的例子:

# 错误:没有接收函数返回的结果
x = [0]*3
back_sub(A,b)
print(x)  # 打印的是初始的[0,0,0],而非计算后的解

正确的调用方式应该是:

# 正确:接收函数返回的解
x = back_sub(A,b)
print(x)  # 输出 [0.6666666666666666, 7, -1.3333333333333333],也就是[2/3,7,-4/3]

2. 你的预期结果有误

你提到预期x1=4/3,但代入原方程组验证的话:

第一个方程:1*x1 +1*x2 -1*x3 = 9
代入x1=4/3,x2=7,x3=-4/3:
4/3 +7 - (-4/3) = 29/3 ≈9.666,并不等于9,显然不满足方程。

正确的解应该是:

  • x3 = 8 / (-6) = -4/3
  • x2 = (3 - 3x3)/1 = 3 -3(-4/3)=7
  • x1 = (9 -x2 +x3)/1 =9-7 + (-4/3)=2/3

这个结果和你的代码计算出的结果完全一致。

3. 代码的优化建议

为了避免修改原始的b(numpy数组是可变对象,函数内修改b会影响外部变量),同时提升代码鲁棒性,建议做如下修改:

def back_sub(A,b):
    n = A.shape[0]  # 用shape[0]获取行数比len(A)更稳妥,适配数组和矩阵类型
    print('n is:', n)
    x = [0.0]*n  # 初始化为浮点数列表,避免整数/浮点数类型混淆
    b_copy = b.copy()  # 复制原始b,不修改外部传入的数据
    for i in range(n-1,-1,-1):
        for j in range(i+1,n):
            b_copy[i] = b_copy[i] - A[i,j]*x[j]
        x[i] = b_copy[i]/A[i,i]
    return x

内容的提问来源于stack exchange,提问作者Corp. and Ltd.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:16:10