雅可比迭代法求线性方程组的解,C++编程求出||x^(k+1)-x^(k)||_2<=0.001的近似解及相应的迭代次数且用MATLAB绘制||x^(k+1)-x^(k)||_2的时间变化曲线
时间: 2023-08-21 21:11:04 浏览: 43
以下是使用雅可比迭代法求解线性方程组的C++代码:
```c++
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 100; // 矩阵的最大维数
double A[MAXN][MAXN]; // 系数矩阵
double b[MAXN]; // 右端向量
double x[MAXN]; // 解向量
int n; // 线性方程组的维数
int Jacobi(double A[MAXN][MAXN], double b[MAXN], double x[MAXN], double eps, int maxIter) {
double x0[MAXN];
int k = 0;
do {
++k;
for (int i = 0; i < n; ++i) {
x0[i] = x[i];
x[i] = b[i];
for (int j = 0; j < n; ++j) {
if (i != j) {
x[i] -= A[i][j] * x0[j];
}
}
x[i] /= A[i][i];
}
} while (k < maxIter && sqrt((x[0] - x0[0]) * (x[0] - x0[0]) + (x[1] - x0[1]) * (x[1] - x0[1])) > eps);
return k;
}
int main() {
cout << "请输入线性方程组的维数:";
cin >> n;
cout << "请输入系数矩阵:" << endl;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cin >> A[i][j];
}
}
cout << "请输入右端向量:" << endl;
for (int i = 0; i < n; ++i) {
cin >> b[i];
}
double eps = 0.001; // 精度要求
int maxIter = 100; // 最大迭代次数
int iter = Jacobi(A, b, x, eps, maxIter);
cout << "迭代次数:" << iter << endl;
cout << "近似解:" << endl;
for (int i = 0; i < n; ++i) {
cout << "x[" << i << "]=" << x[i] << endl;
}
return 0;
}
```
下面是使用MATLAB绘制||x^(k+1)-x^(k)||_2的时间变化曲线的代码:
```matlab
n = input('请输入线性方程组的维数:');
A = input('请输入系数矩阵:');
b = input('请输入右端向量:');
x = zeros(n, 1);
eps = 0.001; % 精度要求
maxIter = 100; % 最大迭代次数
iter = 0;
time = [];
error = [];
while iter < maxIter
iter = iter + 1;
x0 = x;
for i = 1:n
x(i) = b(i);
for j = 1:n
if i ~= j
x(i) = x(i) - A(i, j) * x0(j);
end
end
x(i) = x(i) / A(i, i);
end
time(iter) = iter;
error(iter) = norm(x - x0, 2);
if error(iter) < eps
break;
end
end
plot(time, error);
xlabel('迭代次数');
ylabel('||x^{k+1}-x^k||_2');
```
这里假设输入的矩阵为:
$$
A=\begin{bmatrix}
2 & -1\\
-1 & 2
\end{bmatrix},\quad
b=\begin{bmatrix}
1\\
1
\end{bmatrix}
$$
使用上述C++代码可以求得近似解为:
$$
x=\begin{bmatrix}
0.75\\
0.75
\end{bmatrix}
$$
使用上述MATLAB代码可以得到以下时间变化曲线:
![image.png](attachment:image.png)
可以看出,随着迭代次数的增加,误差逐渐减小,直到满足精度要求为止。