gauss.c:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define A(i,j) A[j+i*N]
#define b(i) b[i]
#define x(i) x[i]
void outA(char * s, int N, float * A) {
int i,j;
printf("\n%s\n",s);
for (i=0;i<N;i++) {
for (j=0;j<N;j++)
printf("%4.1f\t",A(i,j));
printf("\n");
}
}
void outB(char * s, int N, float * b) {
int i,j;
printf("\n%s\n",s);
for (i=0;i<N;i++) printf("%4.1f\n",b(i));
}
int main(int argc, char * argv[]) {
int N,i,j,k;
float *A, *A1, *b, *b1, *x, m;
FILE *f;
if (argc < 2) {
printf("Usage: %s <file>\nNow GTFO!\n",argv[0]);
return -1;
}
f = fopen(argv[1],"r");
if (!f) {
printf("GTFO!!!\n");
return -1;
}
fscanf(f,"%u",&N);
A = malloc(N*N*sizeof(float));
b = malloc(N*sizeof(float));
A1 = malloc(N*N*sizeof(float));
b1 = malloc(N*sizeof(float));
x = malloc(N*sizeof(float));
for (i=0;i<N;i++) {
for (j=0;j<N;j++)
fscanf(f,"%f",&A(i,j));
fscanf(f,"%f",&b(i));
}
fclose(f);
printf("N = %u\n",N);
outA("Матрица A",N,A);
outB("Вектор b",N,b);
memcpy(A1,A,N*N*sizeof(float));
memcpy(b1,b,N*sizeof(float));
for (i=0;i<N-1;i++)
for (j=i+1;j<N;j++) {
m = -A(j,i)/A(i,i);
for (k=i;k<N;k++)
A(j,k)+=m*A(i,k);
b(j)+=m*b(i);
}
// outA("Матрица A после прямого хода метода Гаусса",N,A);
// outB("Вектор b после прямого хода метода Гаусса",N,b);
for (i=N-1;i>=0;i--) {
for (j=N-1;j>i;j--) {
b(i) -= x(j)*A(i,j);
}
x(i) = b(i)/A(i,i);
}
printf("\nРешение:\n");
for (i=0;i<N;i++) printf("%4.1f\n",x(i));
memcpy(A,A1,N*N*sizeof(float));
memcpy(b,b1,N*sizeof(float));
printf("\nНевязка:\n");
for (i=0;i<N;i++) {
m = b(i);
for (j=0;j<N;j++)
m -= A(i,j)*x(j);
printf("%e\n",m);
}
return 0;
}
matrix.txt:
6
2 0 -0.5 0 0.5 0 0
0 5.3 0 1.3 0 -2.7 29.4
-8 0 5 0 5 0 -8
0 -2.7 0 9.3 0 -2.7 5.4
-8 0 4 0 6 0 -12
0 -2.7 0 1.3 0 5.3 -34.6
___________________A_________________________ __b__
6 на первой строчке — размерность матрицы.