【发布时间】: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<double>而不是new double[]和double *。您现在拥有的代码会泄漏内存。 -
在第二个公式的实现中:for(j = i+1; j
-
@che.wang 如果我按照你说的做,它会变成截图中的内容(我附在问题上)
-
@Vs_De_S 示例输入。所以我们可以自己检查。
标签: c++ math linear-algebra equation