Sunteți pe pagina 1din 4

MN_L3: METODE DIRECTE DE REZOLVARE A SISTEMELOR DE ECUAŢII LINIARE

Se consideră sistemul de n ecuaţii liniare cu n necunoscute, scris sub forma matricială :


A⋅x = b (1)
unde A este o matrice reală cu n linii şi n coloane, inversabilă (nesingulară), iar b este un vector
(coloana) cu n componente .
Problema de calcul constă în determinarea unei soluţii x a sistemului (1), adică a unui
vector care satisface egalităţile (1) .
METODELE NUMERICE DIRECTE constau în aducerea sistemului (1) la un sistem
echivalent, direct rezolvabil prin mijloace elementare. Tipic, procedura de reducere are la bază o
schema de eliminare succesivă a necunoscutelor, tradiţional atribuită lui Gauss, prin care se
efectuează triangularizarea matricii sistemului, adică aducerea matricii A la forma superior
triunghiulară sau inferior triunghiulară, prin transformari de echivalenţă. Ca urmare, metodele
directe furnizează soluţia exactă, x , a sistemului (1), în cazurile (ideale) în care erorile de rotunjire
sunt absente .
Lucrarea de faţă se referă la metoda directă de rezolvare a sistemelor de ecuaţii liniare cu
PIVOTARE PARȚIALĂ. Procedura implică două etape :

I. Aducerea matricii sistemului la forma superior triunghiulară, alegând, la fiecare pas k = 1, n − 1 ,


drept element necesar eliminării înainte a necunoscutelor – elementul | a ik ,k |= max{| a i ,k |} .
i =k ,n

Operaţia de eliminare este însoţită, dacă este necesar, de permutarea liniilor implicate, pentru a
aduce pivotul în poziţia (k,k). Transformările elementare de echivalenţă afectează şi termenul
liber al sistemului, în mod corespunzător.
II. Rezolvarea sistemului triunghiular obţinut prin substituţie inversă. Permutările de coloane în
etapa I afectează ordinea componentelor vectorului soluţie, deci, în final, este necesara o
reordonare a acestora. Uzual, calculele au loc "pe loc", matricea A şi termenul liber b - iniţiale
distrugându-se .

APLICAŢIE: Să se realizeze, în mediul de programare MATLAB, programul pentru rezolvarea


unui sistem de n ecuaţii liniare cu n necunoscute, prin metoda directă cu pivotare totală.
Programul va compara soluţia găsită cu cea furnizată de mediul MATLAB.

În realizarea programului se vor parcurge următoarele etape, descrise parţial în limbajul pseudocod:

1. Introducere parametru de control al execuţiei procedurii de triangularizare, în variabila EPS.


2. Introducere ordin sistem, în variabila n, n ≥ 2 .
3. Alocare spaţiu de memorie pentru matricea sistemului, în variabila a, prin iniţializarea acesteia cu
o matrice nulă, de dimensiune n. Introducerea elementelor matricii sistemului se face pe linii (a se
vedea OBSERVAŢIA 2). Salvarea valorilor din matricea a:
ATRIBUIE aa ← a
Reluare introducere în caz de eroare.

4. Alocare spaţiu de memorie pentru termenul liber al sistemului, în variabila b, prin iniţializarea
acesteia cu un vector coloană nul, cu n componente. Introducerea elementelor termenului liber al
sistemului se face pe linii. Salvarea valorilor din vectorul b:

ATRIBUIE bb ← b

Reluare introducere în caz de eroare.

1
5. Faza I : eliminarea înainte cu pivotare totală:
* Pivotare parțială:
ATRIBUIE L ← eye(n)
┌ PENTRU k = 1, n-1 EXECUTĂ
│ ATRIBUIE [ml, ik] ← max( abs( a(k:n,k) ) )
│ ATRIBUIE ik ← ik + (k - 1)
│ ┌ DACĂ ( ik ~= k ) ATUNCI
│ │ ATRIBUIE wmx ← zeros(1,n)
│ │ ATRIBUIE wmx ← a(k,:)
│ │ ATRIBUIE a(k,:) ← a(ik,:)
│ │ ATRIBUIE a(ik,:) ← wmx
│ │ ATRIBUIE t ← b(k)
│ │ ATRIBUIE b(k) ← b(ik)
│ │ ATRIBUIE b(ik) ← t
│ └
│* Triangularizare

│ ┌ DACĂ ( abs(a(k,k)) > EPS ) ATUNCI
│ │ ATRIBUIE a(k+1:n, k) ← a(k+1:n, k) / a(k, k)
│ │ ATRIBUIE a(k+1:n,k+1:n) ← a(k+1:n, k+1:n) - a(k+1:n,k) * a(k,k+1:n)
│ │ ATRIBUIE temp ← eye(n)
│ │ ATRIBUIE temp (k+1:n, k)← a(k+1:n, k)
│ │ ATRIBUIE L ← L*temp
│ │ ATRIBUIE b(k+1:n) ← b(k+1:n) - a(k+1:n, k) * b(k)
│ │ ATRIBUIE a(k+1:n, k) ← zeros(n-k, 1)
│ │ALTFEL
│ │ SCRIE 'pivot nul sau foarte mic'
│ │ SCRIE 'STOP: algoritm'
│ │ * STOP program (funcţia MATLAB: return)
│ └
│SCRIE 'k = ', k
│SCRIE ‘inversa matricii Gauss de transformare = ‘, temp
│SCRIE ‘L = ‘, L
│SCRIE 'a = ', a
│SCRIE 'b = ', b

6. Faza a-II-a : calcul soluţie sistem
* Substituţia înapoi :
┌ PENTRU i = 1, n EXECUTĂ
│ ┌ DACĂ ( abs(a(i,i)) < EPS ) ATUNCI
│ │ SCRIE 'matrice prost conditionata'
└ └
ATRIBUIE b(n) ← b(n) / a(n,n)
┌ PENTRU i = n-1, -1 ,1 EXECUTĂ
│ ATRIBUIE sum ← a(i, i+1:n) * b(i+1:n)
│ ATRIBUIE b(i) ← (b(i) - sum) / a(i,i)

ATRIBUIE x ← b
7. Calcul soluţie folosind funcţiile MATLAB, pentru comparaţie :

2
ATRIBUIE x_bs ← aa \ bb
ATRIBUIE x_inv ← inv(aa) * bb
8. Afişare soluţii : x, x_bs, x_inv (mod de afişare MATLAB dat de funcţia : format long e;) .
9. Calcul reziduuri asociate soluţiilor calculate, precum şi norme euclidiene :

ATRIBUIE r ← bb-aa*x
ATRIBUIE nr ← norm(r,2)
ATRIBUIE r_bs ← bb - aa*x_bs
ATRIBUIE nr_bs ← norm(r_bs,2)
ATRIBUIE r_inv ← bb - aa*x_inv
ATRIBUIE nr_inv ← norm(r_inv,2)

Afişare nr, nr_bs, nr_inv (mod de afişare MATLAB dat de functia : format long e;) .

10. Reluare program, dacă se doreşte, cu alt termen liber (punctul 4). Dacă are loc reluarea, înainte
de aceasta se reface matricea a:

ATRIBUIE a ← aa

11. Reluare program, dacă se doreşte, cu alt sistem de acelaşi ordin, n (punctul 3).
12. Reluare program, dacă se doreşte, cu un sistem de alt ordin, n (punctul 2).
13. Reluare program, dacă se doreşte, cu alt parametru EPS (punctul 1) .

OBSERVAŢII :
1. Descrierea anterioară a programului de realizat foloseşte următoarele funcţii MATLAB: max,
zeros, abs, return, \, inv, norm.
2. Se recomandă următoarea modalitate generală de introducere a unei matrici, pe linii (n linii, m
coloane), în variabila a:
* secvenţa de comenzi MATLAB :

a = zeros(n,m);
for i=1:n,
fprintf('linia %g:',i);
a(i,:) = input(' ');
end;

* exemplu de introducere (n=m=3) :

linia 1:
[1 2 3] <ENTER>
linia 2:
[4 5 6] <ENTER>
linia 3:
[7 8 9] <ENTER>

S-au subliniat mesajele afişate de către program; <ENTER> semnifică apăsarea tastei respective.

3. Programul se va rula pentru următoarele date de intrare (rezultatele se vor nota şi comenta) :

EPS = 1.e-10

3
 10 − 7 0  7 
I.) n = 3; a = − 3 2.099 6; b = 3.901
 
 5 − 1 5  6 
 3 2 100 105
II.) n = 3; a = − 1 3 100; b = 102
 
 1 2 − 1   2 
 0.03 0.02 1  1.05
n = 3; a = − 0.01 0.03 1 ; b = 1.02 (acelaşi exemplu cu scalare pe linii)
 
 0.5 1 − 0.5  1 
 1 −2 3  5
III.) n = 3; a =  2 4 − 1; b = 7 ;
 
− 1 − 14 11  2
0 2 0 1  7 
2 2 3 2   − 2
IV.) n = 4; a =   ;b =  
4 − 3 0 1  − 7
   
 6 1 − 6 − 5 6 

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