Sunteți pe pagina 1din 5

ALGORITM PENTRU CALCULUL DETERMINANTULUI

UNEI MATRICI

Formularea problemei. Să se scrie o funcţie care să evalueze determinantul unei


matrici.

Noţiuni teoretice. Se poate utiliza algoritmul Gauss de reducere a matricii la una


triunghiulară superior: prin operaţii asupra liniilor (cu efect cuantificabil asupra valorii
determinantului - schimbarea semnului) se anulează elementele de sub diagonala principală,
valoarea determinantului fiind egală în acest caz cu produsul elementelor de pe diagonala
principală.
Se consideră matricea pătratică de ordin n:

 a11 a12 K a1n 


a a 22 K a 2 n 
 21
K K K K
 
 a n1 an2 K a nn 

Se presupune a11 ≠ 0 . În caz contrar, se comută liniile până când este îndeplinită
această condiţie. Se definesc multiplicatorii:

a i1
mi = cu i = 2, n .
a11

Se înmulţeşte succesiv prima linie cu multiplicatorii mi şi se scade din linia i


corespunzătoare, anulându-se elementele de pe prima coloană începând cu linia a doua.

a11 a12 K a1n 


0 '
a 22 K a 2' n 

0 a32'
K a3' n 
 
K K K K
 0 a n' 2 K ' 
a nn 

'
Presupunând că a 22 ≠ 0 , se definesc în continuare multiplicatorii pentru a face
ai' 2
„zerouri” sub prima diagonală pe coloana a doua mi' = '
, cu i = 3, n şi se procedează ca
a 22
la prima coloană.
80 13. Algoritm pentru calculul determinantului unei matrici

După n-1 etape va rezulta următoarea formă a matricii:

a11 a12 K K K K K a1n


0 '
a 22 K K K K K 
a 2' n
 
K K K K K K K K 
 i −1 
,
0 0 K 0 aiii −1 aii,−i 1+1 K ain 
K K K K K K K K
 n −1 
 0 0 K 0 0 0 0 a nn 

n
al cărei determinant, egal cu ∏a
i =1
i −1
ii , diferă de determinantul matricii iniţiale doar prin

semn, dacă s-a efectuat un număr impar de interschimbări.


Se vor propune în continuare câteva exerciţii pentru rezolvarea unor subprobleme
ale algoritmului prezentat anterior.

Exerciţiul 1. Să se scrie o funcţie care prin permutări asupra liniilor unei matrici să
aducă pe poziţia k, k un element nenul, cu k citit de la tastatură.

Propunere de algoritm. Funcţia este importantă deoarece, în definirea


multiplicatorilor, elementul aii apare la numitor, de unde rezultă necesitatea valorii sale
nenule.
Se verifică dacă elementul de pe poziţia k,k este nenul. În caz afirmativ, funcţia nu
operează nici o modificare asupra matricii, iar variabila de test t se incrementează. În caz
contrar se caută, printr-o instrucţiune repetitivă, primul element nenul de pe coloană. Linia
acestuia este interchimbată cu prima linie, moment în care se incrementează variabila test.
Pentru interschimbare se utilizează funcţia declarată anterior. Dacă pe coloană nu se găseşte
nici un element nenul, nu se face nici o modificare asupra matricii, iar variabila test rămâne
nulă.

pivot ( a , k) := t←0  4 2 3 7 


 4 2 3 7  4 2 0 7

t ← 1 if a
k, k 6 0 9 3  
m :=  pivot ( m, 1) =  6 0 9 3 
i←k 4 2 0 7
 8
8 4 6 8 
(
while ¬a
k, k )⋅ (i < rows(a))  4 6 8 
 1


if a
i, k  0 0 4 3
 7 6 2 8 
7 6 2 8  0 
a ← invers ( a , k , i) n :=   0 4 3

t←t+1
9 0 1 3 pivot ( n , 0) =  9 0 1 3 
4  4
i←i+ 1  2 7 8 2 7 8 
 
a  1 
  0 5 3 
t 0 5 3 
0 2 1 
p :=  0 2 1 pivot ( p , 0) = 
  0 9 8 
0 9 8  
 0 
13. Algoritm pentru calculul determinantului unei matrici 81

Exerciţiul 2. Să se scrie o funcţie care să returneze matricea rezultată după aplicarea


algoritmului Gauss pentru prima coloană. Se va presupune că elementul de pe poziţia 0,0
este nenul.
Propunere de algoritm. Liniile matricii, mai puţin prima, sunt parcurse printr-o
instrucţiune repetitivă de variabilă de ciclare i. Multiplicatorul aferent fiecăreia este
memorat în variabila m. Parcurgerea după coloane se face printr-o instrucţiune repetitivă de
variabilă de ciclare j.

gauss_1 ( a) := for i ∈ 1 .. rows ( a) − 1  8 3 7 8


2 2 7 4
a
i, 0 m := 
m← 2 0 8 5
a 3
0, 0  6 3 1
for j ∈ 0 .. cols ( a) − 1
 8 3 7 8 
a ←a −a ⋅m
i, j i, j 0, j
0 1.25 5.25 2 
gauss_1 ( m) = 
a  0 −0.75 6.25 3 
 0 4.875 0.375 −2
 
Exerciţiul 3. Să se scrie o funcţie care să returneze forma finală a matricii după
aplicarea algoritmului Gauss. Între datele de ieşire va figura şi o variabilă ce va memora
numărul interschimbărilor efectuate pentru aducerea pivoţilor pe diagonala principală.

Propunere de algoritm. Funcţia propusă, gauss, are ca argument formal matricea


m al cărei determinant se evaluează. Ea returnează un tablou cu două elemente.
Primul este matricea cu elementele calculate prin aplicarea operaţiilor metodei
Gauss, în cazul în care sunt îndeplinite condiţiile aplicării ei (dacă se găseşte un pivot, fapt
verificat de funcţia pivot de la exerciţiul precedent). Dacă la pasul respectiv nu se găseşte
un pivot, se returnează matricea cu componentele calculate până la momentul respectiv.
Al doilea element, scalarul n, contorizează numărul de inversări de linii efectuate
pentru găsirea pivotului.
Formulele de calcul sunt preluate din partea teoretică a lucrării.

gauss ( a) := n←0
for k ∈ 1 .. cols ( a) − 1
for j ∈ k .. rows ( a) − 1 0 2 4 8

2 5 3 8
if ¬a
k− 1 , k− 1 m := 
2 0 8 5
a ← pivot ( a , k − 1) 9
0  0 3 1
n←n+1
if pivot ( a , k − 1)
1
a
j , k− 1
m←  2 5 3 8 
a
k− 1 , k− 1
 0 2 4 8 

 
for i ∈ k − 1 .. cols ( a) − 1 gauss ( m) =  0 0 15 17  
a ←a −a ⋅m  0 0 0 15.9  
j, i j, i k− 1 , i
 
a   1 

n
82 13. Algoritm pentru calculul determinantului unei matrici

Exerciţiul 4. Să se scrie o funcţie care să calculeze produsul elementelor de pe


diagonala principală a unei matrici pătratice.

Propunere de algoritm. Algoritmul este asemănător cu cel de la calculul urmei


matricii. Produsul va fi memorat într-o variabilă, p, iniţializată cu valoarea elementului
neutru faţă de operaţia de înmulţire. Argumentul formal al funcţiei este matricea a iar data
de ieşire este valoarea produsului.

detr ( a) := p←1
for i ∈ 0 .. cols ( a) − 1
p ← p⋅ a
i, i

Exerciţiul 5. Să se calculeze determinantul unei matrici.

Propunere de algoritm. Funcţia centrală, determinant, apelează funcţiile declarate


precedent. Ea utilizează produsul elementelor de pe diagonala principală a matricii Gauss şi
numărul de interschimbări de linii, cu efect asupra semnului determinantului.

( )
gauss( a) 1
determinant ( a) := ( −1) ⋅ detr gauss ( a)
0  0 2 4 8
2 5 3 8
m := 
2 0 8 5
determinant ( m) = −954 9
 0 3 1

Se prezintă, în continuare, un program în limbaj C ce calculează determinantul unei


matrici după metoda Gauss.

#include<stdio.h>
#include<conio.h>
main(){
float a[10][10],p=1,m,temp,t=0;
int rows,i,j,k,n;
printf(ʺIntroduceti numarul de linii (coloane):ʺ);scanf(ʺ%iʺ,&rows);
printf(ʺIntroduceti elementele, dupa linii:\nʺ);
for(i=0;i<rows;i++)
for(j=0;j<rows;j++)
scanf(ʺ%fʺ,&a[i][j]);
printf(ʺAti introdus matricea:\nʺ);
for(i=0;i<rows;i++)
{for(j=0;j<rows;j++)
printf(ʺ%.2f\tʺ,a[i][j]);
printf(ʺ\nʺ);}
for(k=1;k<=rows-1;k++)
for(j=k;j<rows;j++)
{
i=k-1;
while((!a[k-1][k-1])*(i<rows))
{
13. Algoritm pentru calculul determinantului unei matrici 83

if(a[i][k-1])
{
for(n=0;n<rows;n++)
{
temp=a[i][n];
a[i][n]=a[k-1][n];
a[k-1][n]=temp;
}
p=-p;t++;
}
i++;
}
if(t)
{
m=a[j][k-1]/a[k-1][k-1];
for(i=k-1;i<rows;i++)
a[j][i]=a[j][i]-a[k-1][i]*m;
}
}
for(i=0;i<rows;i++)
p=p*a[i][i];
printf(ʺValoarea determinantului este %.2fʺ,p);
getch();}

Temă de lucru

Se dă o matrice. Să se scrie o funcţie care să verifice:


• Dacă elementele unei linii sau ale unei coloane sunt toate nule.
• Dacă există două linii sau două coloane proporţionale.

S-ar putea să vă placă și