Revizia anterioară Revizia următoare
Eliminare Gaussiană
(Categoria Algoritmi, Autor Petru Trîmbiţaş)
- Conţinut:
- Descriere
- Implementare
- Aplicaţii
- Bibliografie
Descriere
Eliminarea Gaussiană este o metodă de rezolvare a ecuaţiilor matriciale de forma .
Să presupunem că avem următorul sistem:

Pentru a rezolva sistemul vom transforma toate elementele de sub diagonala principală a matricei extinse în 0 pentru a putea scrie fiecare necunoscută doar în funcţie de necunoscutele cu indici mai mari.

Având matricea sub această formă putem să aflăm uşor fiecare necunoscută din ecuaţia în care necunoscutele cu indici mai mici au coeficientul 0:
Acum că ştim să aflăm necunoscutele din forma triunghiulară a matricei ne mai rămâne doar să transformăm matricea.
Pentru a transforma matricea în formă triunghiulară vom aplica două operaţii:
: interschimbarea a două linii
unde
este o linie a matricei extinse.
De exemplu:
Pentru a obţine a doua matrice am înmulţit prima linie cu şi am adunat-o la a doua linie, iar apoi am adunat-o la ultima linie(
). Pentru a obţine ultima matrice am înmulţit a doua linie cu
.
Cum se poate observa şi din exemplu la fiecare pas construim o coloană şi o linie din matricea finală, coloana fiind umplută cu 0 sub linia fixată. Să presupunem că vrem să transformăm toate elementele de sub linia i aflate pe coloana j în 0. Pentru fiecare linie k ( k>i ) vom înmulţi linia i cu şi o vom aduna la linia k astfel elementul de pe coloana j transformându-se în 0. În cazul în care
trebuie să căutăm o linie k(k > i) astfel încât
. În cazul în care această linie nu există, sistemul nu are soluţie. Aplicând aceşti pasi vom ajunge în final la o matrice triunghiulară din care vom afla necunoscutele.
Implementare
Codul de mai jos rezolva si cazul când avem mai multe ecuaţii decât necunoscute.
void elim(int n,int m,double s[][]) {//sistem cu n ecuatii m necunoscute
for(int i=1,j=1,k;i<=n && j<=m;) {
for(k=i;k<=n; ++k) if(s[k][j]!=0) break;//cautam o linie pe care sa o folosim pentru a forma zerouri pe coloana j
if(k>n) {//trecem la urmatoarea coloana linia i nefiind finala
++j;
continue;
}
if(k!=i)for(int l=1; l<=m+1; ++l) swap(s[i][l],s[k][l]);//interschimbam liniile pentru a avea pe linia i si coloana j un element nenul
for(k=i+1; k<=n; ++k) for(int l=m+1; l>=j; --l)
s[k][l]-=((s[k][j]*s[i][l])/s[i][j]);//aplicam transformarea pentru fiecare linie mai mare ca i pentru a avea 0 pe coloana j sub linia i
++i; ++j;
}
//aflam necunoscutele
for(int i=n; i;--i) for(int j=1; j<=m+1; ++j) if(fabs(s[i][j])>EPS) {//pentru ca e posibil sa avem mai multe ecuatii decat necunoscute
//cautam pe fiecare linie primul coeficient nenul, acestia aparand de la dreapta la stanga
if(j==m+1) {//linia nu are coeficienti nenuli deci nu avem solutie
g<<"Imposibil";
exit(0);
}
x[j]=s[i][m+1];
for(int k=j+1; k<=m; ++k) x[j]-=s[i][k]*x[k];
x[j]/=s[i][j];
break;//trecem la linia precedenta
}
}
Aplicaţii
The magic matrix
https://apps.topcoder.com/wiki/display/tc/TCO+2013+Round+2A#TheMagicMatrix
Go2
Gxor