【问题标题】:C++ Gauss–Seidel methodC++ 高斯-赛德尔法
【发布时间】:2021-12-15 11:35:12
【问题描述】:

这是求解线性代数方程组的简单迭代方法的一段代码:

double* iter(double** a, double* y, int n, int& iter)
{
    double* res = new double[n];
    int i, j;
    
    for (i = 0; i < n; i++)
    {
        res[i] = y[i] / a[i][i];
    }

    double eps = 0.0001;
    double* Xn = new double[n];

    do {
        iter++;

        for (i = 0; i < n; i++) {
            Xn[i] = y[i] / a[i][i];
            for (j = 0; j < n; j++) {
                if (i == j)
                    continue;
                else {
                    Xn[i] -= a[i][j] / a[i][i] * res[j];
                }
            }
        }

        bool flag = true;
        for (i = 0; i < n - 1; i++) {
            if (fabs(Xn[i] - res[i]) > eps) {
                flag = false;
                break;
            }
        }

        for (i = 0; i < n; i++) {
            res[i] = Xn[i];
        }

        if (flag)
            break;
    } while (1);

    return res;
}

及其公式:

但我想实现seidel方法。并根据下面的公式稍微更改了代码

for (i = 0; i < n; i++) {
            Xn[i] = y[i] / a[i][i];
            for (j = 0; j < i-1; 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];
            }
        }

但我并没有完全达到我的预期:

如果您能告诉我哪里出错了,我将不胜感激。提前感谢您的回答。

【问题讨论】:

  • 如果你能告诉我我在哪里犯了错误,我将不胜感激 -- 手动计算,然后use a debugger 看看你的程序与手动计算的不同之处.
  • 顺便说一句,您最好使用std::vector&lt;double&gt; 而不是new double[]double *。您现在拥有的代码会泄漏内存。
  • 在第二个公式的实现中:for(j = i+1; j
  • @che.wang 如果我按照你说的做,它会变成截图中的内容(我附在问题上)
  • @Vs_De_S 示例输入。所以我们可以自己检查。

标签: c++ math linear-algebra equation


【解决方案1】:

你的错误在于新的实现。

Seidel 方法的第一个 sum 与对角线之前的元素相加,而您的 for 循环最多为对角线之前的两个元素。

而不是 for(j = 0; j &lt; i-1; j++) 你应该有 for(j = 0; j &lt; i; j++)

请注意,如果对角线上的元素不为零,则适用高斯塞德尔方法。

【讨论】:

  • 我不能这样做,然后我会得到我问题中最后一个屏幕截图的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2011-02-03
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多