雅可比迭代法求线性方程组的解,C++编程求出||x^(k+1)-x^(k)||_2<=0.001的近似解及相应的迭代次数
时间: 2024-01-22 08:18:54 浏览: 81
数值算法 雅克比迭代法解线性方程组.ppt
以下是使用雅可比迭代法求解线性方程组的C++代码,其中使用了向量的L2范数(即Euclidean范数)计算迭代误差:
```c++
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 100;
const double eps = 1e-6;
int n;
double a[MAXN][MAXN], b[MAXN], x[MAXN];
bool check(double x[], double y[], int n, double eps) {
double sum = 0;
for (int i = 0; i < n; i++) {
sum += (x[i] - y[i]) * (x[i] - y[i]);
}
return sqrt(sum) <= eps;
}
int jacobi() {
int cnt = 0;
double y[MAXN];
while (true) {
cnt++;
for (int i = 0; i < n; i++) {
y[i] = b[i];
for (int j = 0; j < n; j++) {
if (i != j) {
y[i] -= a[i][j] * x[j];
}
}
y[i] /= a[i][i];
}
if (check(x, y, n, eps)) {
break;
}
copy(y, y + n, x);
}
copy(y, y + n, x);
return cnt;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
cin >> b[i];
x[i] = 0; // 初始解为全0向量
}
int cnt = jacobi();
cout << "迭代次数:" << cnt << endl;
cout << "近似解:";
for (int i = 0; i < n; i++) {
cout << x[i] << " ";
}
cout << endl;
return 0;
}
```
需要注意的是,雅可比迭代法只有在系数矩阵是对称、正定或者严格对角占优时才能收敛。如果系数矩阵不满足这些条件,可能会出现迭代不收敛的情况。此外,迭代次数的多少也与初始解的选取有关,当然迭代次数越多,误差也会越小。
阅读全文