Pagini recente » Cod sursa (job #2329708) | Cod sursa (job #43377) | Cod sursa (job #754065) | Cod sursa (job #2506353) | Cod sursa (job #1240597)
#include <cstdio>
#include <cmath>
#define MAX 305
#define epsilon 0.001
#define test(a) (abs(a) > epsilon)
int N, M;
double matrix[MAX][MAX];
double solution[MAX];
using namespace std;
void printMatrix();
void read()
{
freopen("gauss.in", "r", stdin);
freopen("gauss.out", "w", stdout);
scanf("%d %d", &N, &M);
M++;
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
{
scanf("%lf", &matrix[i][j]);
}
}
}
inline void switchRows(int a, int b)
{
double aux;
for(int j = 0; j < M; j++)
{
aux = matrix[a][j];
matrix[a][j] = matrix[b][j];
matrix[b][j] = aux;
}
}
void elimination()
{
int index;
for(int c = 0; c < M; c++)
{
index = -1;
for(int i = c; i < N; i++)
{
if(test(matrix[i][c]))
{
index = i;
break;
}
}
if (index == -1)
continue;
switchRows(c, index);
double aux = matrix[c][c];
for(int j = c; j < M; j++)
matrix[c][j] = matrix[c][j] / aux;
for(int i = c + 1; i < N; i++)
{
aux = matrix[i][c];
for(int j = c; j < M; j++)
{
matrix[i][j] = matrix[i][j] - matrix[c][j] * aux;
}
}
}
}
void printMatrix()
{
for(int i = 0; i < N; i++)
{
for(int j = 0; j < M; j++)
{
printf("%.10lf ", matrix[i][j]);
}
printf("\n");
}
}
int solve()
{
if(M <= N)
{
if(test(matrix[M-1][M-1]))
return 0;
}
int min = N > M ? M : N;
for(int i = min - 1; i >= 0; i--)
{
if(!test(matrix[i][i]))
continue;
solution[i] = matrix[i][M-1];
for(int j = i + 1; j < M - 1; j++)
solution[i] -= matrix[i][j] * solution[j];
}
return 1;
}
int main()
{
read();
elimination();
int r = solve();
if(r)
{
for(int i = 0; i < M - 1; i++)
printf("%.10lf ", solution[i]);
}
else
{
printf("Imposibil");
}
return 0;
}