Jacobi送代法、Gauss-Seidel送代法和SOR送代法c语言代码
时间: 2024-05-08 15:21:48 浏览: 5
以下是Jacobi、Gauss-Seidel和SOR的C语言代码实现:
Jacobi送代法:
```c
#include <stdio.h>
#include <math.h>
#define N 3
#define eps 1e-5
int main()
{
int i, j, k, flag;
double a[N][N], b[N], x[N], p[N], sum;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
scanf("%lf", &a[i][j]);
}
scanf("%lf", &b[i]);
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i != j) {
a[i][j] /= a[i][i];
}
}
b[i] /= a[i][i];
a[i][i] = 0;
x[i] = b[i];
}
k = 0;
do {
flag = 0;
for (i = 0; i < N; i++) {
p[i] = b[i];
for (j = 0; j < N; j++) {
p[i] -= a[i][j] * x[j];
}
if (fabs(x[i] - p[i]) > eps) {
flag = 1;
}
x[i] = p[i];
}
k++;
} while (flag && k <= 100);
if (k <= 100) {
printf("The solution is:\n");
for (i = 0; i < N; i++) {
printf("%lf\n", x[i]);
}
} else {
printf("Failed to converge in 100 iterations!\n");
}
return 0;
}
```
Gauss-Seidel送代法:
```c
#include <stdio.h>
#include <math.h>
#define N 3
#define eps 1e-5
int main()
{
int i, j, k, flag;
double a[N][N], b[N], x[N], p[N], sum;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
scanf("%lf", &a[i][j]);
}
scanf("%lf", &b[i]);
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i != j) {
a[i][j] /= a[i][i];
}
}
b[i] /= a[i][i];
a[i][i] = 0;
x[i] = b[i];
}
k = 0;
do {
flag = 0;
for (i = 0; i < N; i++) {
p[i] = b[i];
for (j = 0; j < N; j++) {
if (j < i) {
p[i] -= a[i][j] * p[j];
} else if (j > i) {
p[i] -= a[i][j] * x[j];
}
}
if (fabs(x[i] - p[i]) > eps) {
flag = 1;
}
x[i] = p[i];
}
k++;
} while (flag && k <= 100);
if (k <= 100) {
printf("The solution is:\n");
for (i = 0; i < N; i++) {
printf("%lf\n", x[i]);
}
} else {
printf("Failed to converge in 100 iterations!\n");
}
return 0;
}
```
SOR送代法:
```c
#include <stdio.h>
#include <math.h>
#define N 3
#define eps 1e-5
int main()
{
int i, j, k, flag;
double a[N][N], b[N], x[N], p[N], sum;
double omega = 1.5;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
scanf("%lf", &a[i][j]);
}
scanf("%lf", &b[i]);
}
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (i != j) {
a[i][j] /= a[i][i];
}
}
b[i] /= a[i][i];
a[i][i] = 0;
x[i] = b[i];
}
k = 0;
do {
flag = 0;
for (i = 0; i < N; i++) {
p[i] = b[i];
for (j = 0; j < N; j++) {
if (j < i) {
p[i] -= a[i][j] * p[j];
} else if (j > i) {
p[i] -= a[i][j] * x[j];
}
}
p[i] *= omega;
p[i] += (1 - omega) * x[i];
if (fabs(x[i] - p[i]) > eps) {
flag = 1;
}
x[i] = p[i];
}
k++;
} while (flag && k <= 100);
if (k <= 100) {
printf("The solution is:\n");
for (i = 0; i < N; i++) {
printf("%lf\n", x[i]);
}
} else {
printf("Failed to converge in 100 iterations!\n");
}
return 0;
}
```