Sunteți pe pagina 1din 9

Calculul unui determinant

prin metoda lui Gauss


cu pivotare totala
Jerca Vlad
anul I gr. 152
Universitatea Bucuresti
Facultatea De Matematica-Informatica
Specializarea Tehnologia Informatiei
Cuprins
1. Descrierea Metodei ............................................................................................3
2. Exemple de afare a determinantilor cu ajutorul pivotarii totale .............................. 4
3. Cod in Limbajul C ..............................................................................................5
4. Rularea programului ........................................................................................... 8
3
1.Descrierea Metodei
Pentru majoritatea metodelor de rezolvare a sistemelor de ecuatii liniare - fe ele directe sau iterative
- se ajunge ca la un moment dat sa fe necesara impartirea la un element diagonal din matricea A, a
ii
.
Acest element poarta numele generic de pivot. Desigur, daca acest element este nul metoda respectiva
esueaza, deoarece - din punct de vedere numeric - operatia de impartire la 0 este imposibila si, daca nu
se iau masuri speciale, orice program de calcul se intrerupe din executie ca urmare a producerii unei erori
de tipul Run time error, cu un mesaj de eroare de genul Floating point overfow.
Situatia extrema in care intr-o matrice A poate sa apara un element diagonal nul este cea in care
matricea respectiva este singulara (determinantul ei este nul). Pe de alta parte, pivotul se poate anula fara
ca matricea A sa fe singulara. Mai mult decat atat, pivotul poate f nenul, dar cu o valoare foarte mica, astfel
incat impartirea la el sa conduca la producerea unor erori de rotunjire, care prin acumulare pot denatura
rezultatul.
Evitarea unor asemenea situatii se poate face prin adoptarea unei masuri care sa permita aducerea
pe diagonala a unui element sufcient de mare. O asemenea tehnica este aceea a pivotarii care consta in
schimbarea intre ele a doua linii sau a doua coloane, astfel incat noul pivot sa aiba o valoare absoluta cat
mai mare posibil. Cautarea noului pivot se face pe coloana curenta i*, pe liniile situate sub linia i*, inclusiv
aceasta (pivotarea partiala) sau pe liniile si coloanele situate sub linia i* si la dreapta coloanei i*, inclusiv
acestea (pivotarea completa).
In cazul pivotarii partiale, la un pas i*, se spune ca se executa pivotarea partiala pe coloana i*. Prin
aceasta tehnica se cauta pe coloana i* elementul subdiagonal maxim in valoare absoluta si se schimba
linia i* cu linia in care apare acel element. Deoarece schimbarea a doua linii in matricea A inseamna de fapt
schimbarea ordinii a doua ecuatii din sistem, se impune ca - simultan - sa se realizeze si interschimbarea
termenilor liberi corespunzatori din vectorul b si de asemenea, schimbarea semnului determinantului matricii.
Metoda de eliminare Gauss permite si calcularea determinantului matricii sistemului. Se observa ca,
matricea A
(3)
a sistemului find triunghiulara, are determinantul egal cuprodusul elementelor diagonale, adica:
Avand in vedere, insa, ca prin impartirea liniilor matricii sistemului la elementele pivot rezulta o matrice
a carui determinant este egal cu determinantul matricii initiale impartit la produsul elementelor pivot, rezulta:
Metoda descrisa mai sus poate f generalizata si aplicata la rezolvarea unui sistem cu
un numar oarecare de n ecuatii liniare cu n necunoscute de forma
Curs 13 Rezolvarea sistemelor de ecuaii liniare

6

Determinantul matricii sistemului
Metoda de eliminare Gauss permite i calcularea determinantului matricii sistemului.
Se observ c, matricea A
(3)
a sistemului (6) fiind triunghiular, are determinantul egal cu
produsul elementelor diagonale, adic:
det A
(3)
=1
Avnd n vedere, ns, c prin mprirea liniilor matricii sistemului la elementele pivot rezult
o matrice a crui determinant este egal cu determinantul matricii iniiale mprit la produsul
elementelor pivot, rezult:
) 2 (
33
) 1 (
22 11
) 2 (
33
) 1 (
22 11
) 3 (
det : 1
det
det a a a A adica
a a a
A
A = = =

Metoda descris mai sus poate fi generalizat i aplicat la rezolvarea unui sistem cu
un numr oarecare de n ecuaii liniare cu n necunoscute de forma (8):

= + + +
= + + +
= + + +
m n mn m m
n n
n n
b x a x a x a
b x a x a x a
b x a x a x a
...
........ .......... .......... ..........
...
...
2 2 1 1
2 2 2 22 1 21
1 1 2 12 1 11
(8)
sau sub form matriceal:
(
(
(
(

=
(
(
(
(

(
(
(
(

m n mn m m
n
n
b
b
b
x
x
x
a a a
a a a
a a a
... ...
.
...
... ... ... ...
...
...
2
1
2
1
2 1
2 22 21
1 12 11


La fiecare pas k al fazei eliminrii se efectueaz mprirea liniei pivot k la elementul
diagonal
) k (
kk
a
1
. Deoarece este posibil ca un element pivot s fie egal cu zero (ceea ce
conduce la imposibilitatea continurii fazei eliminrii), n practic se procedeaz astfel:
a) se determin elementul maxim al matricii A
(k1)
situat pe coloana k i pe liniile l k
(pe diagonala principal i sub ea), adic elementul a
lk
;
b) se aduce elementul maxim a
lk
gsit pe diagonala principal, interschimbnd ntre ele
liniile l i k.
Relaiile de calcul al elementelor matricii sistemului i a matricii termenilor liberi sunt:
1 1 1
1
1
1
1 1 1
:


=
=
=
k
k
k
i
k
i
k
i
k
kk
k
ik k
i
k
kj
k
i
k
ij
k
ij
b m b b
respectiv
a
a
m
cu
a m a a

cu: i,j=k+1, ...,n i k=1,n-1
Curs 13 Rezolvarea sistemelor de ecuaii liniare

6

Determinantul matricii sistemului
Metoda de eliminare Gauss permite i calcularea determinantului matricii sistemului.
Se observ c, matricea A
(3)
a sistemului (6) fiind triunghiular, are determinantul egal cu
produsul elementelor diagonale, adic:
det A
(3)
=1
Avnd n vedere, ns, c prin mprirea liniilor matricii sistemului la elementele pivot rezult
o matrice a crui determinant este egal cu determinantul matricii iniiale mprit la produsul
elementelor pivot, rezult:
) 2 (
33
) 1 (
22 11
) 2 (
33
) 1 (
22 11
) 3 (
det : 1
det
det a a a A adica
a a a
A
A = = =

Metoda descris mai sus poate fi generalizat i aplicat la rezolvarea unui sistem cu
un numr oarecare de n ecuaii liniare cu n necunoscute de forma (8):

= + + +
= + + +
= + + +
m n mn m m
n n
n n
b x a x a x a
b x a x a x a
b x a x a x a
...
........ .......... .......... ..........
...
...
2 2 1 1
2 2 2 22 1 21
1 1 2 12 1 11
(8)
sau sub form matriceal:
(
(
(
(

=
(
(
(
(

(
(
(
(

m n mn m m
n
n
b
b
b
x
x
x
a a a
a a a
a a a
... ...
.
...
... ... ... ...
...
...
2
1
2
1
2 1
2 22 21
1 12 11


La fiecare pas k al fazei eliminrii se efectueaz mprirea liniei pivot k la elementul
diagonal
) k (
kk
a
1
. Deoarece este posibil ca un element pivot s fie egal cu zero (ceea ce
conduce la imposibilitatea continurii fazei eliminrii), n practic se procedeaz astfel:
a) se determin elementul maxim al matricii A
(k1)
situat pe coloana k i pe liniile l k
(pe diagonala principal i sub ea), adic elementul a
lk
;
b) se aduce elementul maxim a
lk
gsit pe diagonala principal, interschimbnd ntre ele
liniile l i k.
Relaiile de calcul al elementelor matricii sistemului i a matricii termenilor liberi sunt:
1 1 1
1
1
1
1 1 1
:


=
=
=
k
k
k
i
k
i
k
i
k
kk
k
ik k
i
k
kj
k
i
k
ij
k
ij
b m b b
respectiv
a
a
m
cu
a m a a

cu: i,j=k+1, ...,n i k=1,n-1
4
2. Exemple de afare a determinantilor cu ajutorul pivotarii totale
a. Pivot 0
La primul pas pivotul a
11
are valoarea maxima pe linie / coloana, deci nu are loc interschimbare si se
trece direct la calcul. Dupa calcul verifcam linia si coloana pentru pivotul a
22
observam ca 4 este valoarea
cea mai mare in modul si interschimbam linia a 2-a cu linia a 3-a, iar determinantul il inumultim cu -1 si
trecem la pasul II.
Observam ca la pasul III pivotul a
33
are valoarea 0, determinantul ia valoarea 0 si procesul se incheie.
b. Pivot diferit de 0
5 0 0
0 1 0 det = 1
0 4 0
1 2 1
3 1 3 det = 1
4 1 1
4 1 1
3 1 3 det = -1
1 2 1
1 1/4 1/4
0 1/4 9/4 det = -4
0 7/4 3/4
1 1/4 1/4
0 9/4 1/4 det = 4
0 3/4 7/4
1 1/4 1/4
0 1 1/9 det = 9
0 0 5/3
1 1/4 1/4
0 1 1/9 det = 15
0 0 1
1 0 0
0 1 0 det = 5
0 4 0
1 0 0
0 4 0 det = -5
0 1 0
1 0 0
0 1 0 det = -20
0 0 0
L2 <-> L3
L1 <-> L3 C2 <-> C3
pas II pas I
pas I
pas II pas III
det = 0
5
3. Cod in Limbajul C
#include<stdio.h>
#include<conio.h>
//citeste matricea
void citireMat(foat a[20][20], int n)
{
int i, j;
for(i=1;i<=n;i++)
{
if(i==1)
printf(\nIntroduceti prima linie: );
else printf(Introduceti a %d-a linie: , i);

for(j=1;j<=n;j++)
scanf(%f, &a[i][j]);
}
}
//afseaza matricea
void afsareMat(foat a[20][20], int n)
{
int i, j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf(%.2f , a[i][j]);
printf(\n);
}
}
// verifca si schimba linia / coloana cu cel mai mare termen in modul
void verifcSchimb(foat a[20][20],int n, int pas, foat &det)
{
foat schimb[20], maxlin=0, maxcol=0, pivot;
int i, iMax, jMax;
pivot=a[pas][pas];
if(pivot<0)
pivot=pivot*-1;
/*Parcurge linia pe care se afa pivotul si retine valoarea cea mai valoare in modul in variabila maxlin si
coloana pe care se afa in jMax*/
for(i=pas+1; i<=n; i++)
if(a[pas][i]<0)
{
if(-1*a[pas][i]>maxlin)
{
maxlin=a[pas][i]*-1;
jMax=i;
}
}
else if(a[pas][i]>maxlin)
{
maxlin=a[pas][i];
jMax=i;
}
6
/*Parcurge coloana pe care se afa pivotul si retine valoarea cea mai valoare in modul in variabila maxcol si linia pe
care se afa in iMax*/
for(i=pas+1; i<=n; i++)
if(a[i][pas]<0)
{
if(-1*a[i][pas]>maxcol)
{
maxcol=a[i][pas]*-1;
iMax=i;
}
}
else if(a[i][pas]>maxcol)
{
maxcol=a[i][pas];
iMax=i;
}
printf(\n\t\t MAXIM LINIE:%.2f; MAXIM COLOANA:%.2f\n, maxlin,maxcol);

/*Daca pivotul este mai mic decat maximul coloanei si maximul coloanei mai mare decat maximul
liniei are loc interschimbare intre linia pivotului si linia iMax*/
if(pivot<maxcol && maxcol>maxlin)
{
printf(\t\t -----Interschimbam linia %d cu linia %d!-----\n, pas, iMax);
for(i=1;i<=n;i++)
{

schimb[i]=a[iMax][i];
a[iMax][i]=a[pas][i];
a[pas][i]=schimb[i];
}
det=det*(-1);
}
/*Altfel daca pivotul este mai mic decat maximul liniei si maximul coloanei mai mic decat
maximul liniei are loc interschimbare intre coloana pivotului si coloana jMax*/
else if(pivot<maxlin&&maxcol<=maxlin)
{
printf(\t\t-----Interschimbam coloana %d cu coloana %d!-----\n, pas,
jMax);
for(i=1;i<=n;i++)
{

schimb[i]=a[i][jMax];
a[i][jMax]=a[i][pas];
a[i][pas]=schimb[i];
}
det=det*(-1);
}
if(pivot<maxlin||pivot<maxcol)
{
printf(\nMatricea dupa interschimbare :\n\n);
afsareMat(a, n);
}
else printf(\t\t -------NU ARE LOC INTERSCHIMBARE!-------\n\n);

}
7
//functia de calcul
void pasGauss(foat a[20][20], int n, int pas, foat &det)
{
int i, j;
foat pivot;
pivot=a[pas][pas];
det=det*pivot;
for(i=pas+1;i<=n;i++)
for(j=pas+1;j<=n;j++)
if(pivot!=0)
a[i][j]=a[i][j]-(a[pas][j]*a[i][pas])/pivot; // are loc pasul
else break;

for (i=1 ; i<=n; i++)
if(pivot!=0)
a[pas][i]=a[pas][i]/pivot; // impartim linia pivotului la pivot
for(i=pas;i<=n;i++)
a[i+1][pas]=0; // elementele sub pivot iau valoarea 0
}
//functia principala
int main()
{
foat matSist[20][20], determinant=1;
int n;
//se citeste ordinul matricii si valorile acesteia
printf(ORDINUL MATRICII: );
scanf(%d, &n);
citireMat(matSist, n);
//se afseaza matricea initiala
printf(\nMatricea citita:\n\n);
afsareMat(matSist, n);
//apelez functiile de n ori pentru afarea determinantului
for(int pas=1;pas<=n;pas++)
{
verifcSchimb(matSist, n, pas, determinant);
printf(\n\t\t\t\t-----PASUL %d !----- \n\n, pas);
pasGauss(matSist, n, pas, determinant);
printf(\nMatricea dupa pasul %d:\n\n, pas);
afsareMat(matSist, n);
printf(\t\t\t\t DET -> %0.2f\n, determinant);
}
printf(\n\t\t\tDeterminantul matricii este : %0.2f, determinant);
printf(\n\t\tCodat de Jerca Vlad, gr. 152, anul I, sectia IT);
getch();
return 0;
}
8
4. Rularea programului
Exemplul 2.a.
9
Exemplul 2.b.