Pagini recente » Cod sursa (job #2969890) | Cod sursa (job #1530749) | Cod sursa (job #2289321) | Cod sursa (job #264858) | Cod sursa (job #1733843)
#include <fstream>
#include <cmath>
#include <iomanip>
using namespace std;
ifstream f("gauss.in") ;
ofstream g("gauss.out") ;
int n , m ;
double a[303][303];
double x[303];
const double eps = 1e-10 ;
int main()
{
//Citire
f >> n >> m ;
for ( int i = 1 ; i <= n ; ++i )
for ( int j = 1 ; j <= m + 1 ; ++j )
f >> a[i][j] ;
int i = 1 , j = 1 , k ;
double aux;
//Algoritmul lui Gauss
while ( i <= n && j <= m )
{
//Cautam o linie k pentru care A[k][j] sa fie nenul
for ( k = i ; k <= n ; ++k )
if( abs ( a[k][j] ) > eps )
break ;
//Daca nu gasim linia, necunoscuta j este variabila libera ;
if ( k == n + 1 )
++j ;
//Interschimbam pe k cu i, daca este cazul.
if ( k != i )
for ( int l = 1 ; l <= m + 1 ; ++l )
swap ( a[i][l] , a[k][l] ) ;
//impartim linia la "elementul pivot"
for ( int l = j + 1 ; l <= m + 1 ; ++l )
a[i][l] = a[i][l] / a[i][j];
a[i][j] = 1 ;
//Scadem din ecuatiile i+1...N ecuatia i inmultita cu A[u][j], pentru a face toti coeficientii de coloana j a acestor linii 0.
for ( int u = i + 1 ; u <= n ; ++u )
{
for ( int l = j + 1 ; l <= m + 1 ; ++l )
a[u][l] -= a[u][j] * a[i][l] ;
a[u][j] = 0 ;
}
++i , ++j;
}
//Calculul necunoscutelor
int posibil = 1 ;
for ( int i = n ; i && posibil ; --i )
for ( int j = 1 ; j <= m + 1 && posibil ; ++j )
if( abs ( a[i][j] ) > eps )
{
//Singura valoare nenegativa de pe linia i este rezultatul => sistemul nu are solutie.
if ( j == m + 1 )
{
g << "Imposibil" ;
posibil = 0 ;
}
//Calculam pe necunoscuta j = rezultatul ecuatiei i - necunoscutele j+1...M inmultite cu coeficientii lor din aceasta ecuatie.
x[j] = a[i][m+1];
for(int k = j + 1 ; k <= m ; ++k )
x[j] -= x[k] * a[i][k];
break;
}
if ( posibil )
for ( int i = 1 ; i <= m ; ++i)
g << setprecision(10) << fixed << x[i] << " " ;
return 0;
}