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

高斯消元法回代函数报错问题排查求助

解决高斯消元回代函数的错误

原代码的核心问题

  • 未同步更新增广列:回代时仅修改了系数矩阵部分(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

关键修改说明

  1. 整行变换:直接对M[j, :]执行行变换,确保系数矩阵和增广列同步更新,解决了结果偏差的核心问题。
  2. 正确定位主元:使用np.flatnonzero找到第一个非零元素的索引,避免了argmax带来的错误判断。
  3. 简化逻辑:移除冗余的变量拷贝与赋值,让代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 08:05:20