Académique Documents
Professionnel Documents
Culture Documents
8.1 Introducere
Rezolvarea sistemelor de ecuaţii liniare joacă un rol central în analiza numerică.
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 .
(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 .
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
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 .
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 .
α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
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.
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];
}
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).