用C语言解决Gauss-Seidel迭代法解方程组7X1+2X2+3X3=14;2X1+5X2+2X3=18;3X1+X2+5X3=20,输出方程组的解及矩阵L和U
时间: 2023-08-06 16:09:08 浏览: 100
gauss_Seidel迭代法解方程(C语言代码)
4星 · 用户满意度95%
好的,我们可以使用 C 语言编写程序来解决这个问题。具体地,我们可以先将矩阵 A 和向量 b 定义为数组,然后使用 Gauss-Seidel 迭代法求解方程组。下面是示例代码:
```c
#include <stdio.h>
#include <math.h>
#define N 3
int main()
{
double A[N][N] = {{7, 2, 3}, {2, 5, 2}, {3, 1, 5}};
double b[N] = {14, 18, 20};
double L[N][N], U[N][N];
double x[N], x_old[N];
double eps = 1e-6;
int max_iter = 1000;
int iter = 0, i, j;
// LU 分解
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (j < i) {
L[i][j] = A[i][j];
U[i][j] = 0;
} else if (j == i) {
L[i][j] = 1;
U[i][j] = A[i][j];
} else {
L[i][j] = 0;
U[i][j] = A[i][j];
}
}
}
// Gauss-Seidel 迭代
do {
// 备份上一次迭代的解
for (i = 0; i < N; i++) {
x_old[i] = x[i];
}
// 更新解
for (i = 0; i < N; i++) {
double sum1 = 0, sum2 = 0;
for (j = 0; j < i; j++) {
sum1 += L[i][j] * x[j];
}
for (j = i + 1; j < N; j++) {
sum2 += U[i][j] * x_old[j];
}
x[i] = (b[i] - sum1 - sum2) / U[i][i];
}
iter++;
// 检查收敛条件
double err = 0;
for (i = 0; i < N; i++) {
err += pow(x[i] - x_old[i], 2);
}
err = sqrt(err);
} while (err > eps && iter < max_iter);
// 输出解
printf("Solution:\n");
for (i = 0; i < N; i++) {
printf("X%d = %f\n", i + 1, x[i]);
}
// 输出 LU 分解结果
printf("\nL:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%f ", L[i][j]);
}
printf("\n");
}
printf("\nU:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%f ", U[i][j]);
}
printf("\n");
}
return 0;
}
```
运行程序后,将会输出方程组的解以及矩阵 L 和 U 的值。注意,由于 Gauss-Seidel 迭代法的收敛速度较慢,因此需要设置一个适当的收敛精度和最大迭代次数,以避免程序无限循环。
阅读全文