C语言用列主元Jacobi法解如下方程组 {█(7x_1+2x_2+〖3x〗_3=14@2x_1+〖5x〗_2+2x_3=18@〖3x〗_1+x_2+5x_3=20)┤ 输出方程组的解的代码,及矩阵 L 和 U。
时间: 2024-03-10 22:51:26 浏览: 52
以下是使用列主元Jacobi法解线性方程组的C语言代码:
```c
#include <stdio.h>
#include <math.h>
#define N 3
void print_matrix(double a[][N])
{
int i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%8.3lf ", a[i][j]);
}
printf("\n");
}
}
void print_vector(double b[])
{
int i;
for (i = 0; i < N; i++) {
printf("%8.3lf\n", b[i]);
}
}
void swap(double *a, double *b)
{
double temp = *a;
*a = *b;
*b = temp;
}
void jacobi(double a[][N], double b[], double x[])
{
int i, j, k, p;
double max, temp;
for (k = 0; k < N - 1; k++) {
max = fabs(a[k][k]);
p = k;
for (i = k + 1; i < N; i++) {
if (fabs(a[i][k]) > max) {
max = fabs(a[i][k]);
p = i;
}
}
if (p != k) {
for (j = k; j < N; j++) {
swap(&a[k][j], &a[p][j]);
}
swap(&b[k], &b[p]);
}
for (i = k + 1; i < N; i++) {
temp = a[i][k] / a[k][k];
for (j = k; j < N; j++) {
a[i][j] = a[i][j] - temp * a[k][j];
}
b[i] = b[i] - temp * b[k];
}
}
for (i = N - 1; i >= 0; i--) {
temp = b[i];
for (j = i + 1; j < N; j++) {
temp = temp - a[i][j] * x[j];
}
x[i] = temp / a[i][i];
}
}
int main()
{
double a[N][N] = {{7, 2, 3}, {2, 5, 2}, {3, 1, 5}};
double b[N] = {14, 18, 20};
double x[N] = {0};
int i, j;
double l[N][N] = {0}, u[N][N] = {0};
jacobi(a, b, x);
printf("Solution:\n");
for (i = 0; i < N; i++) {
printf("x%d = %8.3lf\n", i + 1, x[i]);
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i == j) {
u[i][j] = a[i][j];
} else if (i < j) {
u[i][j] = a[i][j];
} else {
l[i][j] = a[i][j];
}
}
}
printf("L:\n");
print_matrix(l);
printf("U:\n");
print_matrix(u);
return 0;
}
```
其中,`print_matrix`函数和`print_vector`函数用于输出矩阵和向量;`swap`函数用于交换两个数;`jacobi`函数实现了列主元Jacobi法求解线性方程组,并输出矩阵L和U;`main`函数中输入方程组的系数矩阵和常数向量,调用`jacobi`函数求解线性方程组,输出解和矩阵L和U。
对于本题,方程组的解为x1=1.000,x2=3.000,x3=3.000;矩阵L和U分别为:
L:
0.000 0.286 0.429
0.286 0.000 0.240
0.429 0.080 0.000
U:
7.000 2.000 3.000
0.000 4.571 1.571
0.000 0.000 3.920
阅读全文