#include <stdio.h>
#include <math.h>
#define err 1e-6
#define Maxstep 1000
void Gauss_Seidel(int n, double A[][100], double b[], double x[]);
double _sum(int i, int n, double A[][100], double b[], double x[]);
double _max(double a, double b);
int main() {
int n;
double A[100][100];
double b[100],x[100];
scanf("%d", &n);
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
scanf("%lf", &A[i][j]);
}
}
for(int i = 0; i < n; i++) scanf("%lf", &b[i]);
for(int i = 0; i < n; i++) scanf("%lf", &x[i]);
Gauss_Seidel(n, A, b, x);
}
double _max(double a, double b){
return a > b ? a : b;
}
double _sum(int i, int n, double A[][100], double b[], double x[]) {
double ret = 0;
for (int j=0; j<n; j++) {
if (j != i) {
ret += A[i][j] * x[j];
}
}
return ret - b[i];
}
void Gauss_Seidel(int n, double A[][100], double b[], double x[]){
double exp = 1 + err;
int step = 0;
while (exp > err && step < Maxstep) {
exp = 0;
double x0[100];
for (int u=0; u<n; u++) {
x0[u] = x[u];
}
for (int i=0; i<n; i++) {
x[i] = -1 / A[i][i] * _sum(i, n, A, b, x);
exp = _max(exp, fabs(x[i] - x0[i]) / (1.0 + fabs(x[i])));
// for (int k=0; k<n; k++) {
// printf("%lf", x[k]);
// }
// printf("\n");
step ++;
}
}
if (step < 1000) {
for (int k=0; k<n; k++) {
printf("%lf ", x[k]);
}
} else {
printf("Fail.");
}
}
Gauss-Seidel迭代法
最新推荐文章于 2024-05-01 07:58:56 发布