Vous êtes sur la page 1sur 9

8

SISTEME DE ECUAŢII ALGEBRICE LINIARE

8.1 Introducere
Rezolvarea sistemelor de ecuaţii liniare joacă un rol central în analiza numerică.

• Metode directe – algoritmi finiţi, erori de rotunjire – Gauss, Crout, Choleski,

• Metode iterative – procese infinite, erori de trunchiere – Jacobi, Gauss-Seidel.

8.2 Metoda de eliminare a lui Gauss


Ideea de bază – aducerea sistemului prin transformări elementare la o formă echivalentă,
cu matrice superior triunghiulară.
Transformarea sistemului – faza eliminării.
Rezolvarea sistemului cu matrice triunghiulară – faza substituţiei inverse.

Exemplificare:
     
 a11 x1 + a12 x2 + a13 x3 = b1 a11 a12 a13 x1 b1
a21 x1 + a22 x2 + a23 x3 = b2 sau  a21 a22 a23   x2  =  b2 

a31 x1 + a32 x2 + a33 x3 = b3 , a31 a32 a33 x3 b3

Faza eliminării:
Pasul 1: Eliminăm x1 din toate ecuaţiile sistemului, cu excepţia primei ecuaţii.
Împărţim prima linie la elementul pivot a11 .
Scădem prima ecuaţie înmulţită cu primul coeficient din celelalte ecuaţii:
     (1) 
(1) (1) (1) (1) (1)

 x1 + a12 x2 + a13 x3 = b1 1 a12 a13 x1 b
(1) (1) (1)  (1) (1)     1(1) 
a22 x2 + a23 x3 = b2 sau  0 a22 a23   x2   b2  .
=

 (1) (1) (1) (1) (1) (1)
a32 x2 + a33 x3 = b3 , 0 a32 a33 x3 b3
cu  (1)

 a1j = a1j /a11 , j = 1, 2, 3

 (1)
b1 = b1 /a11
(1) (1)

 aij = aij − ai1 a1j , j = 1, 2, 3, i = 2, 3

 (1) (1)
bi = bi − ai1 b1 .

Pasul 2: Eliminăm x2 din ultima ecuaţie.


(1) (1)
Împărţim a doua ecuaţie la elementul pivot a22 şi o scădem înmulţită cu a32 din ecuaţia
a treia:     (1) 
(1) (1)
1 a12 a13 x1 b
 (2)     1(2) 
 0 1 a23   x2  =  b2  ,
(2) (2)
0 0 a33 x3 b3
cu  (2) (1) (1)

 a2j = a2j /a22 , j = 2, 3

 (2) (1) (1)
b2 = b2 /a22
(2) (1) (1) (2)

 aij = aij − ai2 a2j , j = 2, 3, i = 3

 (2) (1) (1) (2)
bi = bi − ai2 b2 .

(2)
Pasul 3: Împărţim cea de a treia ecuaţie la elementul pivot a33 :
    (1) 
(1) (1) 
1 a12 a13 x1 b1
(2) 
 0 1 a   x  =  b(2)  
23 2 2 ,
(3)
0 0 1 x3 b3
cu
(3) (2) (2)
b3 = b3 /a33 .

Faza substituţiei inverse:



(3)

 x3 = b3
(2) (2)
x2 = b2 − a23 x3

 x = b(1) − (a(1) x + a(1) x ).
1 1 12 2 13 3

Calculul determinantului:
Datorită împărţirii succesive cu elementele pivot:
detA
detA(3) = (1) (2)
= 1,
a11 a22 a33
rezultă:
(1) (2)
detA = a11 a22 a33 .

2
Generalizare – sistem de n ecuaţii cu n necunoscute – A = [aij ]nn , b = [bi ]n şi
x = [xi ]n :
A · x = b.
Faza eliminării:
Înaintea pasului k (k = 1, 2, . . . n − 1):
 (1) (1) (1) (1)
   (1)

1 a12 ··· a1k a1k+1 ··· a1n x1 b1
 (2) (2) (2)    (2) 
 0 1 ··· a2k a2k+1 ··· a2n  x2   b2 
 . .. ... .. .. ..  ..   .. 
 .. . . . .  .   . 
    
 (k−1) (k−1) (k−1)    (k−1) 
 0 0 · · · akk akk+1 · · · akn   xk  =  bk .
 (k−1) (k−1) (k−1)    (k−1) 
 0 0 · · · ak+1k ak+1k+1 · · · ak+1n   xk+1   bk+1 
    
 .. .. .. .. ... ..   ..   .. 
 . . . . .  .   . 
(k−1) (k−1) (k−1) (k−1)
0 0 · · · ank ank+1 · · · ann xn bn

La pasul k se elimină xk din ecuaţiile de sub ecuaţia k:


 (1) (1) (1) (1)
   (1)

1 a12 · · · a1k a1k+1 · · · a1n x1 b1
 (2)     
 0 1 · · · a(2) (2)
a2k+1 · · · a2n   x2   (2)
b2 
 . .. ...
2k
.. .. ..   ..   .. 
 .. . . . .   .   . 
    
 (k) (k)     (k) 
 0 0 ··· 1 akk+1 · · · akn   xk  =  bk .
 (k) (k)    (k) 
 0 0 · · · 0 ak+1k+1 · · · ak+1n   xk+1   bk+1 
    
 .. .. .. .. ... ..  
.  ..   .. 
 . . . .  .   . 
(k) (k) (k)
0 0 ··· 0 ank+1 · · · ann xn bn

Noile elemente ale liniei pivot k:



(k)

 akk = 1
(k) (k−1) (k−1)
akj = akj /akk , j = k + 1, . . . , n

 (k) (k−1) (k−1)
bk = bk /akk .

Noile elemente ale liniilor de sub linia pivot:



(k)

 aik = 0
(k) (k−1) (k−1) (k)
aij = aij − aik akj , j = k + 1, . . . , n, i = k + 1, . . . , n

 (k) (k−1) (k−1) (k)
bi = bi − aik bk .

La pasul k se modifică doar elementele delimitate de linia şi coloana k.


Nu trebuie considerat j = k, deoarece pe coloana pivot k se generează numai 1 sau 0.

3
(n−1)
La pasul k = n se împarte ultima ecuaţie la ultimul pivot, ann :
    
(1) (1) (1) (1)  (1)
1 a12 · · · a1k a1k+1 · · · a1n x 1 b1
 0 1 ··· (2) (2) (2)     (2) 
 a2k a2k+1 · · · a2n   
x2  
 
b2 

 .. .. ... .. .. ..   ...   .. 
 . . . . 
.    . 
 (k)     
 0 0 ··· (k)
1 akk+1 · · · akn   xk   = (k)
bk ,
   
 (k+1)   (k+1)
 0 0 ··· 0 1 · · · ak+1n   xk+1   
 bk+1 

 . .. .. .. ... 
..   ..   .. 
 .. . . . .  .   . 
(n)
0 0 ··· 0 0 ··· 1 xn bn
sau
A(n) · x = b(n) .
Faza substituţiei inverse:
 (n)

 xn = bn
(k)
X
n
(k)

 xk = bk − aki xi , k = n − 1, . . . , 1.
i=k+1

Calculul determinantului:
Datorită împărţirii succesive cu elementele pivot:
detA
detA(n) = (1) (n−1)
=1
a11 a22 · · · ann
rezultă:
(1) (n−1)
detA = a11 a22 · · · ann .

Generalizare – ecuaţie matricială – B = [bij ]nm şi X = [xij ]nm :


A·X=B

Faza eliminării (k = 1, . . . , n):


 (k) (k−1) (k−1)

 akj = akj /akk , j = k + 1, . . . , n

 b(k) (k−1) (k−1)
kj = bkj /akk , j = 1, . . . , m
(k) (k−1) (k−1) (k)
 aij
 = aij − aik akj , j = k + 1, . . . , n, i = k + 1, . . . , n,

 (k) (k−1) (k−1) (k)
bij = bij − aik bkj , j = 1, . . . , m.
Faza substituţiei inverse:
 (n)

 xnj = bnj , j n= 1, . . . , m
(k)
X (k)

 xkj = bkj − aki xij , j = 1, . . . , m, k = n − 1, . . . , 1.
i=k+1

Inversarea matricilor – ca matrice a termenilor liberi se ia matricea unitate:


B = En ≡ [δij ]nn ⇒ X = A−1 .

4
Pivotarea – rearanjarea liniilor pt. a avea la fiecare pas al eliminării un pivot maxim.
Se minimizează erorile de rotunjire şi se evită împărţirile cu 0
(k−1)
• pivotarea parţială pe coloane – la pasul k se caută elementul maxim alk pe
coloana k şi liniile l ≥ k şi se interschimbă liniile l şi k.
• metoda elementului principal – se caută elementul pivot pe toate liniile şi coloanele
matricii A(k−1) pe care nu s-a pivotat.

/*=========================================================================*/
int Gauss(float **a, float **b, int n, int m, float *det)
/*---------------------------------------------------------------------------
Rezolva ecuatia matriciala a x = b prin metoda Gauss, inlocuind la iesire b
cu x (utilizeaza pivotarea partiala pe coloane).
a - matricea (n x n) a sistemului
b - matricea (n x m) a termenilor liberi; solutia x la iesire
*det - determinantul matricii sistemului (iesire)
Returneaza indicele de eroare: 0 - executie normala
1 - matrice a singulara
---------------------------------------------------------------------------*/
{
#define Swap(a,b) { t = a; a = b; b = t; }
float amax, sum, t;
int i, imax, j, k;
/* ELIMINARE */
*det = 1.0;
for (k=1; k<=n; k++) {
amax = 0.0; /* determina linia pivot avand */
for (i=k; i<=n; i++) /* elementul maxim pe coloana k */
if (amax < fabs(a[i][k])) {amax = fabs(a[i][k]); imax = i;}
if (amax == 0.0)
{printf("Gauss: matrice singulara !\n"); return 1;}
/* interschimba liniile imax si k */
if (imax != k) { /* pt. a pune pivotul pe diagonala */
*det = -(*det);
for (j=k; j<=n; j++) Swap(a[imax][j],a[k][j])
for (j=1; j<=m; j++) Swap(b[imax][j],b[k][j])
}
*det *= a[k][k]; /* inmulteste determinantul cu pivotul */
t = 1.0/a[k][k]; /* imparte linia pivot */
for (j=k+1; j<=n; j++) a[k][j] *= t;
for (j= 1; j<=m; j++) b[k][j] *= t;
for (i=k+1; i<=n; i++) { /* reduce liniile nepivot */
t = a[i][k];
for (j=k+1; j<=n; j++) a[i][j] -= a[k][j]*t;
for (j= 1; j<=m; j++) b[i][j] -= b[k][j]*t;
}
}
/* SUBSTITUTIE INVERSA */
for (k=n-1; k>=1; k--)
for (j=1; j<=m; j++) {
sum = b[k][j];
for (i=k+1; i<=n; i++) sum -= a[k][i]*b[i][j];
b[k][j] = sum;
}
return 0;
}

5
8.7 Sisteme de ecuaţii liniare cu matrice tridiagonală
Matrici tridiagonale – matrici rare – cu majoritatea elementelor extradiagonale 0.
Metodele generale nu sunt eficiente.
În mod tipic → prin discretizarea ecuaţiilor diferenţiale prin scheme cu diferenţe finite.

Fie sistemul:
A · x = d,
sau     
b1 c1 x1 d1
 a2 b2 c2 0  x2   d2 
  ..   .. 
 ... ... ...    
  .   . 
    
 ai−1 bi−1 ci−1   xi−1   di−1 
  = .
 ai bi ci   xi   di 
 . . ...  .   . 
 .. ..   ..   .. 
    
 0 an−1 bn−1 cn−1   xn−1   dn−1 
an bn xn dn
Se factorizează A:
A = L · U,
cu
  
β1 1 γ1
 α2 β 2 0  1 γ2 0 
  
 ... ...  ... ... 
  
  
 αi−1 β i−1  1 γ i−1 
L·U= · 
 αi β i  1 γi 
 ... ...  ... ... 
  
  
 0 αn−1 β n−1  0 1 γ n−1 
αn β n 1

Prin identificare:

 b1 = β 1 , c1 = β 1 γ 1
ai = αi , bi = αi γ i−1 + β i , ci = β i γ i , i = 2, 3, . . . , n − 1

an = αn , bn = αn γ n−1 + β n .

Elementele matricilor L şi U (presupunând β i 6= 0):

αi = ai , i = 2, 3, . . . , n,

 β 1 = b1 , γ 1 = c1 /β 1
β i = bi − ai γ i−1 , γ i = ci /β i , i = 2, 3, . . . , n − 1

β n = bn − an γ n−1 .
Diagonala matricii L estei identică cu diagonala matricii A.

6
Sistemul iniţial devine :
½
L·y = d
L · (U · x) = d ⇔
U · x = y.
sau     
β1 y1 d1
 a2 β 2 0  y2   d2 
  ..   .. 
 . .. . ..    
  .   . 
    
 ai−1 β i−1   yi−1   di−1 
  = 
 ai β i   yi   di 
 ... ...  .   . 
   ..   .. 
    
 0 an−1 β n−1   yn−1   dn−1 
an β n yn dn
şi     
1 γ1 x1 y1
 1 γ2 0  x2   y2 
  ..   .. 
 . .
.. ..    
  .   . 
    
 1 γ i−1   xi−1   yi−1 
  = .
 1 γi   xi   yi 
 ... ...  .   . 
   ..   .. 
    
 0 1 γ n−1   xn−1   yn−1 
1 xn yn

Prin identificarea elementelor:


½
y1 = d1 /β 1
yi = (di − ai yi−1 )/β i , i = 2, 3, . . . , n
½
xn = yn
xi = yi − γ i xi+1 , i = n − 1, . . . , 1.

Faza factorizării:

 β 1 = b1 , γ 1 = c1 /β 1 , y1 = d1 /β 1
β i = bi − ai γ i−1 , γ i = ci /β i , yi = (di − ai yi−1 )/β i

i = 2, 3, . . . , n − 1.

Faza substituţiei inverse:


½
xn = (dn − an yn−1 )/(bn − an γ n−1 )
xi = yi − γ i xi+1 , i = n − 1, . . . , 1.

În implementare sunt suficiente patru tablouri a, b, c şi d, asociate cu ai , bi , ci şi di .


Elementele γ i pot fi stocate în tabloul c, peste mărimile ci .
Pentru di , yi şi x se poate utiliza acelaşi tablou, d, care în final conţine soluţia sistemului.

7
/*=========================================================================*/
void TriDiag(float a[], float b[], float c[], float d[], int n)
/*---------------------------------------------------------------------------
Rezolva un sistem liniar cu matrice tridiagonala prin factorizare
a[] - codiagonala inferioara (i=2..n)
b[] - diagonala principala
c[] - codiagonala superioara (i=1..n-1)
d[] - vectorul termenilor liberi; la iesire contine solutia x
n - ordinul sistemului
---------------------------------------------------------------------------*/
{
float beta;
int i; /* factorizare */
c[1] /= b[1]; d[1] /= b[1];
for (i=2; i<=(n-1); i++) {
beta = b[i] - a[i]*c[i-1];
c[i] /= beta;
d[i] = (d[i] - a[i]*d[i-1])/beta;
}
d[n] = (d[n] - a[n]*d[n-1])/(b[n] - a[n]*c[n-1]);
/* substitutie inversa */
for (i=(n-1); i>=1; i--) d[i] -= c[i]*d[i+1];
}

Nu se efectuează pivotare – dominanţa diagonală a matricii sistemului asigură succesul.

8
Bibliography

[1] Gh. Dodescu, Metode numerice în algebră, Editura tehnică, Bucureşti, 1979).

[2] B.P. Demidovich şi I.A. Maron, Computational Mathematics (MIR Publishers,
Moskow, 1981).

[3] R.L. Burden şi J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &
Schmidt, Boston, 1985).

[4] W.H. Press, S.A. Teukolsky, W.T. Vetterling şi B.P. Flannery, Numerical Recipes in
C: The Art of Scientific Computing, Second Edition (Cambridge University Press,
Cambridge, 1992).

Vous aimerez peut-être aussi