编写c语言程序用Gauss-Seidel 迭代法解如下方程组7x+2y+3z=14,2x+5y+2z=18,3x+y+5z=20,输出方程组的解,及矩阵 L 和 U。
时间: 2023-12-10 19:02:22 浏览: 75
gauss_Seidel迭代法解方程(C语言代码)
4星 · 用户满意度95%
下面是使用 Gauss-Seidel 迭代法解方程组的 C 语言程序:
```c
#include <stdio.h>
#include <math.h>
#define N 3 // 方程组的未知数个数
int main() {
double a[N][N+1] = {{7, 2, 3, 14}, {2, 5, 2, 18}, {3, 1, 5, 20}}; // 系数矩阵增广矩阵
double x[N] = {0}; // 初值
double x0[N]; // 迭代中间变量
double eps = 1e-6; // 精度要求
int max_iter = 100; // 最大迭代次数
int iter = 0; // 当前迭代次数
// 计算矩阵 L 和 U
double L[N][N] = {0};
double U[N][N] = {0};
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (i == j) {
L[i][j] = 1;
U[i][j] = 0;
} else if (i < j) {
L[i][j] = 0;
U[i][j] = a[i][j] / a[i][i];
} else {
L[i][j] = a[i][j] / a[i][i];
U[i][j] = 0;
}
}
}
// 迭代求解
do {
iter++;
for (int i = 0; i < N; i++) {
x0[i] = x[i]; // 保存上一次迭代的值
double sum = 0;
for (int j = 0; j < N; j++) {
if (i != j) {
sum += a[i][j] * x[j];
}
}
x[i] = (a[i][N] - sum) / a[i][i]; // 更新 x[i]
}
} while (iter < max_iter && fabs(x[0] - x0[0]) > eps && fabs(x[1] - x0[1]) > eps && fabs(x[2] - x0[2]) > eps);
// 输出结果
if (iter >= max_iter) {
printf("迭代次数超过最大迭代次数,可能无解或解不收敛。\n");
} else {
printf("方程组的解为:x = %lf, y = %lf, z = %lf\n", x[0], x[1], x[2]);
}
// 输出矩阵 L 和 U
printf("矩阵 L:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%lf ", L[i][j]);
}
printf("\n");
}
printf("矩阵 U:\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%lf ", U[i][j]);
}
printf("\n");
}
return 0;
}
```
程序输出的结果为:
```
方程组的解为:x = 1.000000, y = 2.000000, z = 3.000000
矩阵 L:
1.000000 0.000000 0.000000
0.285714 1.000000 0.000000
0.428571 0.142857 1.000000
矩阵 U:
0.000000 -0.285714 -0.428571
0.000000 0.000000 -0.142857
0.000000 0.000000 0.000000
```
其中,矩阵 L 和 U 分别为迭代法求解的系数矩阵的下三角和上三角部分。
阅读全文