-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgauss2.c
75 lines (63 loc) · 1.32 KB
/
gauss2.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <math.h>
int gauss(double *a, double *x, int N) {
int i, j, k;
int max;
int M = N+1;
double tmp;
/* printf("\n\n",M); */
for(i=0;i<N;i++) {
/* for( j=0;j<N+1;j++) {
printf(" % 1.7f ", *(a+j+i*M));
} */
*(x+i) = 0;
/* printf(" \t\t% 1.7f", *(x+i));
printf("\n"); */
}
for(i=0;i<N;i++) { /* eliminacja */
max=i;
for(j=i+1;j<N;j++) {
if(fabs(*(a+i+j*M))>fabs(*(a+i+max*M))) {
max=j;
}
}
for(k=i;k<N+1;k++) { /* zamiana wierszy wartoœciami */
tmp=(*(a+k+i*M));
*(a+k+i*M)=(*(a+k+max*M));
*(a+k+max*M)=tmp;
}
if(*(a+i+i*M)==0) {
return(0); /* Uk³ad sprzeczny! */
}
for(j=i+1;j<N;j++) {
for(k=N;k>=i;k--) { /* mno¿enie wiersza j przez wspó³czynnik "zeruj¹cy": */
*(a+k+j*M)-=((*(a+k+i*M)*(*(a+i+j*M)))/(*(a+i+i*M)));
}
}
}
/* printf("\n");
for(i=0;i<N;i++) {
for( j=0;j<N+1;j++) {
printf(" % 1.7f ", *(a+j+i*M));
}
printf("\n");
}
*/
#ifdef TEST
printf("MACIERZ TRÓJK¥TNA\n");
for(i=0;i<N;i++) {
for(j=0;j<=N;j++) {
printf(" % 1.7f ",*(a+j+i*M));
printf("\n");
}
}
#endif
/* reduckja wsteczna */
for(j=N-1;j>=0;j--) {
tmp=0;
for(k=j+1;k<N;k++) {
tmp+=*(a+k+j*M)*(*(x+k));
}
*(x+j)=(*(a+N+j*M)-tmp)/(*(a+j+j*M));
}
return(1); /* wszystko w porz¹dku! */
}