Pagini recente » Cod sursa (job #2279234) | Cod sursa (job #1026786) | Cod sursa (job #3148752) | Cod sursa (job #1957321) | Cod sursa (job #3031290)
#include <stdio.h>
#define MAX 380
#define fin "gauss.in"
#define fout "gauss.out"
#define EPS 0.00000001
double matrix[MAX][MAX],//the matrix
xsol[MAX]; //the array of solutions: x1, x2, x2
int n, //rows
m; //columns
int main(int argc, char const *argv[]) {
freopen(fin, "r", stdin);
freopen(fout, "w", stdout);
//read the matrix
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; ++i) {
for(int j = 1; j <= m+1; ++j) {
scanf("%lf", &matrix[i][j]);
}
}
int i = 1, j = 1, k;
double aux;
while(i <= n && j <= m) {
//search for a line for which mat[k][j] is != 0
for(k = i; k <= n; ++i)
if(matrix[k][j] -EPS || matrix[k][j] > EPS)
break;
if(k == n + 1) {
++j;
continue;
}
if( k != i ) {
for(int l = 1; l <= m + 1; l++) {
aux = matrix[i][l];
matrix[i][l] = matrix[k][l];
matrix[k][l] = aux;
}
}
//divide first line with matrix[i][j]
for(int l = j + 1; l <= m + 1; l++) {
matrix[i][l] /= matrix[i][j];
}
matrix[i][j] = 1;
//substruct Eq2 - Eq1
for( int nextLine = i + 1; nextLine <= n; ++nextLine ) {
for( int c = j + 1; c <= m + 1; ++c )
matrix[ nextLine ][ c ] -= matrix[ nextLine ][ j ] * matrix[ i ][ c ];
matrix[ nextLine ][ j ] = 0;
}
i++;
j++;
}
for(int i = n; i > 0; --i)
for(int j = 1; j <= m + 1; j++)
if(matrix[ i ][ j ] > EPS || matrix[i][j] < -EPS) {
if(j == m + 1) {
printf("Imposibil\n");
return 0;
}
xsol[j] = matrix[i][m+1];
for(int k = j + 1; k <= m; ++k)
xsol[j] -= xsol[k] * matrix[i][k];
break;
}
for(int j = 1; j <= m; j++) printf("%.8lf ", xsol[j]);
printf("\n");
return 0;
}