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

C++实现Gauss–Seidel迭代法求解线性方程组错误排查

Gauss-Seidel迭代代码错误修正说明
  • 第一个错误:核心循环的前项遍历边界错误

你修改的核心循环中,前半部分遍历已更新分量的代码写为for (j = 0; j < i-1; j++),该边界会漏掉j = i-1的计算项,不符合Gauss-Seidel迭代的规则:迭代计算第i个分量时,需要用到当前轮次已经计算完成的所有j < i的新值Xn[j]。正确的循环条件应为for (j = 0; j < i; j++)。

  • 第二个错误:收敛校验逻辑存在遗漏

原代码中判断迭代是否收敛的循环写为for (i = 0; i < n - 1; i++),该逻辑跳过了下标为n-1的最后一个未知量的误差校验,若仅有最后一个分量的迭代误差超过设定阈值eps,程序会错误判定为迭代已收敛,导致输出结果精度不达标。正确的循环条件应为for (i = 0; i < n; i++)。

  • 第三个潜在问题:函数名与形参名重名

原代码中函数名为iter,同时迭代计数的引用形参也命名为iter,C++语法不允许同一作用域内出现同名标识,会直接编译失败,建议修改形参名为iter_cnt或者其他不冲突的名称。


修正后核心代码示例

// 修正后的Gauss-Seidel核心迭代循环
for (i = 0; i < n; i++) {
    Xn[i] = y[i] / a[i][i];
    // 前半部分用当前轮次已经算出的新值
    for (j = 0; j < i; j++) {
        Xn[i] -= a[i][j] / a[i][i] * Xn[j];
    }
    // 后半部分用上次迭代的旧值
    for (j = i+1; j < n; j++){
        Xn[i] -= a[i][j] / a[i][i] * res[j];
    }
}

// 修正后的收敛判断逻辑
bool flag = true;
for (i = 0; i < n; i++) {
    if (fabs(Xn[i] - res[i]) > eps) {
        flag = false;
        break;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 08:06:03