Documente Academic
Documente Profesional
Documente Cultură
SISTEME DE ECUA
TII ALGEBRICE LINIARE
8.1 Introducere
Rezolvarea sistemelor de ecuatii liniare joaca un rol central n analiza numerica.
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
(2)
Pasul 3: mpartim cea de a treia ecuatie 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:
Datorita mpartirii succesive cu elementele pivot:
detA
detA(3) = (1) (2)
= 1,
a11 a22 a33
rezulta:
(1) (2)
detA = a11 a22 a33 .
2
Generalizare sistem de n ecuatii cu n necunoscute A = [aij ]nn , b = [bi ]n si
x = [xi ]n :
A x = b.
Faza elimin arii:
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
. .. ... .. .. .. .. ..
.. . . . . . .
(k1) (k1) (k1) (k1)
0 0 akk akk+1 akn xk = bk .
(k1) (k1) (k1) (k1)
0 0 ak+1k ak+1k+1 ak+1n xk+1 bk+1
.. .. .. .. ... .. .. ..
. . . . . . .
(k1) (k1) (k1) (k1)
0 0 ank ank+1 ann xn bn
3
(n1)
La pasul k = n se mparte ultima ecuatie 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 substitutiei inverse:
(n)
xn = bn
(k)
X
n
(k)
xk = bk aki xi , k = n 1, . . . , 1.
i=k+1
Calculul determinantului:
Datorita mpartirii succesive cu elementele pivot:
detA
detA(n) = (1) (n1)
=1
a11 a22 ann
rezulta:
(1) (n1)
detA = a11 a22 ann .
Faza elimin
arii (k = 1, . . . , n):
(k) (k1) (k1)
akj = akj /akk , j = k + 1, . . . , n
b(k) (k1) (k1)
kj = bkj /akk , j = 1, . . . , m
(k) (k1) (k1) (k)
aij
= aij aik akj , j = k + 1, . . . , n, i = k + 1, . . . , n,
(k) (k1) (k1) (k)
bij = bij aik bkj , j = 1, . . . , m.
Faza substitutiei 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
4
Pivotarea rearanjarea liniilor pt. a avea la fiecare pas al eliminarii un pivot maxim.
Se minimizeaza erorile de rotunjire si se evita mpartirile cu 0
(k1)
pivotarea partiala pe coloane la pasul k se cauta elementul maxim alk pe
coloana k si liniile l k si se interschimba liniile l si k.
metoda elementului principal se cauta elementul pivot pe toate liniile si coloanele
matricii A(k1) 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 ecuatii liniare cu matrice tridiagonala
Matrici tridiagonale matrici rare cu majoritatea elementelor extradiagonale 0.
Metodele generale nu sunt eficiente.
n mod tipic prin discretizarea ecuatiilor diferentiale prin scheme cu diferente finite.
Fie sistemul:
A x = d,
sau
b1 c1 x1 d1
a2 b2 c2 0 x2 d2
.. ..
... ... ...
. .
ai1 bi1 ci1 xi1 di1
= .
ai bi ci xi di
. . ... . .
.. .. .. ..
0 an1 bn1 cn1 xn1 dn1
an bn xn dn
Se factorizeaza A:
A = L U,
cu
1 1 1
2 2 0 1 2 0
... ... ... ...
i1 i1 1 i1
LU=
i i 1 i
... ... ... ...
0 n1 n1 0 1 n1
n n 1
Prin identificare:
b1 = 1 , c1 = 1 1
ai = i , bi = i i1 + i , ci = i i , i = 2, 3, . . . , n 1
an = n , bn = n n1 + n .
i = ai , i = 2, 3, . . . , n,
1 = b1 , 1 = c1 / 1
i = bi ai i1 , i = ci / i , i = 2, 3, . . . , n 1
n = bn an n1 .
Diagonala matricii L estei identica cu diagonala matricii A.
6
Sistemul initial devine :
Ly = d
L (U x) = d
U x = y.
sau
1 y1 d1
a2 2 0 y2 d2
.. ..
. .. . ..
. .
ai1 i1 yi1 di1
=
ai i yi di
... ... . .
.. ..
0 an1 n1 yn1 dn1
an n yn dn
si
1 1 x1 y1
1 2 0 x2 y2
.. ..
. .
.. ..
. .
1 i1 xi1 yi1
= .
1 i xi yi
... ... . .
.. ..
0 1 n1 xn1 yn1
1 xn yn
Faza factoriz
arii:
1 = b1 , 1 = c1 / 1 , y1 = d1 / 1
i = bi ai i1 , i = ci / i , yi = (di ai yi1 )/ 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
[3] R.L. Burden si J.D. Faires, Numerical Analysis, Third Edition (Prindle, Weber &
Schmidt, Boston, 1985).
[4] W.H. Press, S.A. Teukolsky, W.T. Vetterling si B.P. Flannery, Numerical Recipes in
C: The Art of Scientific Computing, Second Edition (Cambridge University Press,
Cambridge, 1992).