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

