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.
相关产品推荐
相关产品推荐

