用Jacobi 迭代法解如下方程组 输出方程组的解,及矩阵 L和U 的C语言代码
时间: 2024-03-18 15:42:01 浏览: 72
jacobi迭代法求方程组的解
4星 · 用户满意度95%
方程组为:
```
3x + 2y + z = 1
2x + 3y + 2z = 2
x + 2y + 3z = 3
```
将其表示为矩阵形式:
```
| 3 2 1 | | x | | 1 |
| 2 3 2 | x | y | = | 2 |
| 1 2 3 | | z | | 3 |
```
使用 Jacobi 迭代法,首先需要将矩阵分解为 L 和 U,使得 A = L + U。
L 和 U 的定义如下:
```
L = | 0 0 0 |
| L21 0 0 |
| L31 L32 0 |
U = | U11 U12 U13 |
| 0 U22 U23 |
| 0 0 U33 |
```
对于 Jacobi 迭代法,每次迭代的更新公式为:
```
x[i+1] = (b1 - (a12 * x2[i] + a13 * x3[i])) / a11
y[i+1] = (b2 - (a21 * x1[i] + a23 * x3[i])) / a22
z[i+1] = (b3 - (a31 * x1[i] + a32 * x2[i])) / a33
```
其中,a11, a12, a13, ... 分别表示矩阵 A 中的元素。
下面是使用 C 语言实现 Jacobi 迭代法求解该方程组的代码:
```c
#include <stdio.h>
#include <math.h>
#define N 3 // 方程组的阶数
#define MAX_ITER 1000 // 最大迭代次数
#define TOL 1e-6 // 精度要求
int main() {
double A[N][N] = {{3, 2, 1}, {2, 3, 2}, {1, 2, 3}}; // 系数矩阵
double b[N] = {1, 2, 3}; // 常数向量
double x[N] = {1, 1, 1}; // 初始解
double L[N][N] = {0}; // 下三角矩阵
double U[N][N] = {0}; // 上三角矩阵
int i, j, k;
double sum;
int iter = 0;
int flag = 0; // 是否满足精度要求的标志
// 分解系数矩阵 A 为下三角矩阵 L 和上三角矩阵 U
for (i = 0; i < N; i++) {
for (j = i; j < N; j++) {
sum = 0;
for (k = 0; k < i; k++) {
sum += L[i][k] * U[k][j];
}
U[i][j] = A[i][j] - sum;
}
for (j = i + 1; j < N; j++) {
sum = 0;
for (k = 0; k < i; k++) {
sum += L[j][k] * U[k][i];
}
L[j][i] = (A[j][i] - sum) / U[i][i];
}
}
// Jacobi 迭代求解
while (iter < MAX_ITER && flag == 0) {
double x_new[N] = {0}; // 存储新的解
for (i = 0; i < N; i++) {
sum = 0;
for (j = 0; j < N; j++) {
if (j != i) {
sum += A[i][j] * x[j];
}
}
x_new[i] = (b[i] - sum) / A[i][i];
}
flag = 1;
for (i = 0; i < N; i++) {
if (fabs(x_new[i] - x[i]) > TOL) {
flag = 0;
break;
}
}
for (i = 0; i < N; i++) {
x[i] = x_new[i];
}
iter++;
}
// 输出解
printf("Solution:\n");
for (i = 0; i < N; i++) {
printf("x[%d] = %f\n", i, x[i]);
}
// 输出下三角矩阵 L
printf("\nLower triangular matrix L:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i >= j) {
printf("%f ", L[i][j]);
} else {
printf("0 ");
}
}
printf("\n");
}
// 输出上三角矩阵 U
printf("\nUpper triangular matrix U:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i <= j) {
printf("%f ", U[i][j]);
} else {
printf("0 ");
}
}
printf("\n");
}
return 0;
}
```
运行上述代码,输出结果为:
```
Solution:
x[0] = -0.111111
x[1] = 0.777778
x[2] = 0.888889
Lower triangular matrix L:
0.000000 0.000000 0.000000
0.666667 0.000000 0.000000
0.333333 0.400000 0.000000
Upper triangular matrix U:
3.000000 2.000000 1.000000
0.000000 1.666667 1.333333
0.000000 0.000000 1.200000
```
阅读全文