用C语言编写代码完成如下要求:构造迭代公式 给定一个线性方程组Ax=b,请输出迭代公式x=Bx+f的B和f 输入格式: 先输入一个整数n,A矩阵的阶(n<10) 按增广矩阵的格式输入,共n行,每行n+1个实数,分别是增广矩阵的一行数据,数据之间有一个空格。 输出格式: B和f按增广矩阵的形式输出,即共n行,每行n+1个实数,分别是增广矩阵的一行数据,数据之间有一个空格。 共输出三种格式的结果:Jacobi、Gauss-Seidel及松弛影子0.7的超松弛迭代法。 每种迭代结果之后输出一个空行,精确到小数点
时间: 2024-02-11 21:09:50 浏览: 248
高斯-赛德尔迭代法求线性方程组Ax=b的解
以下是使用C语言编写的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXN 10
double A[MAXN][MAXN], B[MAXN][MAXN], f[MAXN][MAXN], x[MAXN], x_new[MAXN];
int main() {
int n;
printf("请输入矩阵的阶数n:\n");
scanf("%d", &n);
// 输入矩阵A的值
printf("请输入增广矩阵的值:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j <= n; j++) {
scanf("%lf", &A[i][j]);
}
}
// 构造Jacobi迭代公式
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
B[i][j] = 0;
} else {
B[i][j] = -A[i][j] / A[i][i];
}
}
f[i][0] = A[i][n] / A[i][i];
}
printf("Jacobi迭代公式:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%lf ", B[i][j]);
}
printf("%lf\n", f[i][0]);
}
printf("\n");
// 构造Gauss-Seidel迭代公式
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i >= j) {
B[i][j] = 0;
for (int k = 0; k < j; k++) {
B[i][j] += -A[i][k] * B[k][j];
}
B[i][j] /= A[i][i];
} else {
B[i][j] = -A[i][j] / A[i][i];
}
}
f[i][0] = A[i][n] / A[i][i];
}
printf("Gauss-Seidel迭代公式:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%lf ", B[i][j]);
}
printf("%lf\n", f[i][0]);
}
printf("\n");
// 构造松弛影子0.7的超松弛迭代公式
double w = 1.7;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i == j) {
B[i][j] = (1 - w) + w * B[i][j];
} else if (i > j) {
B[i][j] = w * B[i][j] / B[j][j];
} else {
B[i][j] = w * B[i][j] / B[i][i];
}
}
f[i][0] = w * A[i][n] / A[i][i];
}
printf("松弛影子0.7的超松弛迭代公式:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%lf ", B[i][j]);
}
printf("%lf\n", f[i][0]);
}
return 0;
}
```
这段代码可以实现输入一个线性方程组的增广矩阵,然后构造Jacobi、Gauss-Seidel和松弛影子0.7的超松弛迭代公式,并输出B和f。
阅读全文