高斯消元法回代函数报错问题排查求助
解决高斯消元回代函数的错误
原代码的核心问题
- 未同步更新增广列:回代时仅修改了系数矩阵部分(
M[j, :-1]),但行变换需要对整行(包括最后一列的常数项)执行,这是结果偏差的主要原因。 - 主元索引查找错误:
np.argmax(substitution_row)返回的是数组最大值的索引,而非第一个非零元素的索引,会导致主元位置判断错误。 - 冗余变量操作:
row_to_reduce = M[j, :-1]是原矩阵的视图,修改它已能改变原矩阵,后续的M[j, :-1] = row_to_reduce属于冗余操作。
修正后的代码
import numpy as np def back_substitution(M): """ Perform back substitution on an augmented matrix (with unique solution) in reduced row echelon form to find the solution to the linear system. Parameters: - M (numpy.array): The augmented matrix in row echelon form with unitary pivots (n x n+1). Returns: numpy.array: The solution vector of the linear system. """ # 复制输入矩阵避免修改原数据 M = M.copy() num_rows = M.shape[0] if num_rows == 0: return np.array([]) # 从最后一行向上迭代 for row in reversed(range(num_rows)): # 获取当前行第一个非零元素的索引(主元位置) pivot_indices = np.flatnonzero(M[row, :-1]) if not pivot_indices.size: continue # 题目说明有唯一解,理论上不会出现全零行 pivot_idx = pivot_indices[0] # 获取完整的主元行(包含增广列) pivot_row = M[row, :] # 消去当前行上方所有行的主元位置元素 for j in range(row): # 计算消元因子 factor = M[j, pivot_idx] # 对整行执行消元操作 M[j, :] -= factor * pivot_row # 提取最后一列作为解向量 solution = M[:, -1] return solution
关键修改说明
- 整行变换:直接对
M[j, :]执行行变换,确保系数矩阵和增广列同步更新,解决了结果偏差的核心问题。 - 正确定位主元:使用
np.flatnonzero找到第一个非零元素的索引,避免了argmax带来的错误判断。 - 简化逻辑:移除冗余的变量拷贝与赋值,让代码更简洁高效。
内容的提问来源于stack exchange,提问作者Shamal Lakshan
相关产品推荐
相关产品推荐

