Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
A1 3, 3 :=
3
A1 3, 4 := 1
2.2 Factorizarea LU
2.2.1 Breviar teoretic
Fie sistemul compatibil determinat
Ax = b. (2.4)
33
Factorizarea LU presupune descompunerea matricei A ntr-un produs de matrice L U,
unde
11 0 . . . 0 11 12 . . . 1n
21 22 . . . 0 0 22 . . . 2n
L=
. . . . . . . . . . . . U = . . . . . . . . . . . . .
(2.5)
n1 n2 . . . nn 0 0 . . . nn
Aceasta descompunere este posibila daca toti determinantii de colt ai matricei A sunt
nenuli.
Pentru a asigura unicitatea descompunerii, trebuie precizate n elemente ale matricei
L sau U. In mod traditional, se specifica ii sau ii ; daca ii = 1 atunci factorizarea LU
se numeste factorizare Doolittle, iar daca ii = 1 se numeste factorizare Crout.
Astfel, rezolvarea sistemului (2.4) se reduce la rezolvarea sistemelor triunghiulare
Ly = b (2.6)
cu solutia
b1
y1 = 11
i1
X
1 (2.7)
yi = bi ij yj , i = 2, 3, . . . , n
ii
j=1
si
Ux = y (2.8)
cu solutia yn
xn =
nn X
n
1 (2.9)
xi = yi ij xj , i = 2, 3, . . . , n.
j=i+1
ii
34
rezulta ca matricea A este nesingulara si are toti determinantii de colt nenuli, deci se
poate folosi factorizarea LU pentru rezolvarea acestui sistem.
Rezolvare folosind factorizarea Crout
A. Factorizarea Crout
Presupunem ca
1 1 1 11 0 0 1 12 13
A = 2 1 1 = 21 22 0 0 1 23 ,
1 3 2 31 32 33 0 0 1
a11 = 11 1 11 = 1
a12 = 11 12 12 = 1
a13 = 11 13 13 = 1
a21 = 21 1 21 = 2
a22 = 21 12 + 22 1 22 = 3
a23 = 21 13 + 22 23 23 = 1
a31 = 31 1 31 = 1
a32 = 31 12 + 32 1 32 = 2
a33 = 31 13 + 32 23 + 33 1 33 = 1
sau
1 0 0 1 1 1
L = 2 3 0 , U = 0 1 1 .
1 2 1 0 0 1
B. Rezolvarea sistemelor triunghiulare
Pentru rezolvarea sistemului initial, avem de rezolvat doua sisteme triungiulare:
1 0 0 y1 2
2 3 0 y2 = 1 ,
1 2 1 y3 5
35
Rezolvare folosind factorizarea Doolittle
A. Factorizarea Doolittle
Presupunem ca
1 1 1 1 0 0 11 12 13
A = 2 1 1 = 21 1 0 0 22 23
1 3 2 31 32 1 0 0 33
a11 = 1 11 11 =1
a12 = 1 12 12 =1
a13 = 1 13 13 = 1
a21 = 21 11 21 =2
a22 = 21 12 + 1 22 22 = 3
a23 = 21 13 + 1 23 23 =3
a31 = 31 11 31 =1
2
a32 = 31 12 + 32 22 32 =
3
a33 = 31 13 + 32 23 + 1 33 33 =1
sau
1 0 0 1 1 1
L= 2 1 0 , U = 0 3 3 .
1 23 1 0 0 1
B. Rezolvarea sistemelor triunghiulare
Pentru rezolvarea sistemului initial, avem de rezolvat doua sisteme triungiulare:
1 0 0 y1 2
2 1 0 y2 = 1 ,
2
1 3 1 y3 5
36
2.2.3 Probleme propuse
Exercitiul 2.2.2. Sa se gaseasca solutiile urmatoarelor sisteme, folosind cele doua vari-
ante ale
factorizarii LU:
x + 2y + z = 1
a) 3x y + 5z = 14
x + y z = 2
3x + y 2z = 1
b) x+y+z =6
2x y + 4z = 7
2.2.4 Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii
Date de iesire: solutia sistemului
2. a) factorizarea Crout
pentru i = 1, n
ii = 1
pentru i = 1, n
pentru j = 1, i
j1
X
ij = aij ik kj
k=1
pentru j = i + 1, n
i1
!
1 X
ij = aij ik kj
ii k=1
b) factorizarea Doolittle
pentru i = 1, n
ii = 1
pentru i = 1, n
pentru j = 1, i 1
i
!
1 X
ij = aij ik kj
jj k=1
pentru j = i, n
37
i1
X
ij = aij ik kj
k=1
restart: with(linalg):
LUcrout:=proc(A::matrix)
local a1,n,l,u,i,s,j,k;
n:=rowdim(A);
a1:=A;
if a1[1,1]=0 then
ERROR(factorizarea LU nu este aplicabila!);
fi;
for i from n by -1 to 2 do
if det(a1)<>0 then a1:=delrows(delcols(a1,i..i),i..i);
else ERROR(factorizarea LU nu este aplicabila!);
fi;
od;
l:=matrix(n,n,0); u:=matrix(n,n,0);
for i from 1 to n do
u[i,i]:=1;
od;
for i from 1 to n do
for j from 1 to i do
s:=0; for k from 1 to j-1 do s:=s+l[i,k]*u[k,j]; od;
l[i,j]:=A[i,j]-s;
od;
38
for j from i+1 to n do
s:=0; for k from 1 to i-1 do s:=s+l[i,k]*u[k,j]; od;
u[i,j]:=1/l[i,i]*(A[i,j]-s);
od;
od;
RETURN(evalm(l), evalm(u));
end:
LUsist:=proc(l::set(equation), opt::symbol)
local lst, eqm, A, b, n, lu, L, U,i,s,j,aux, rez, rfin;
eqm:=genmatrix(l, [op(indets(l))], flag);
lst:=indets(l);
n:=nops(lst);
A:=delcols(eqm,n+1..n+1);
b:=col(eqm,n+1);
if opt=Crout then
lu:=LUcrout(A);
elif opt=Doolittle then
lu:=LUdoolittle(A);
else ERROR(optiunile sunt: Crout sau Doolittle)
fi;
L:=lu[1];
U:=lu[2];
for i from 1 to n do
s:=0; for j from 1 to i-1 do s:=s+L[i,j]*aux[j] od;
aux[i]:=1/L[i,i]*(b[i]-s)
od;
for i from n by -1 to 1 do
s:=0; for j from i+1 to n do s:=s+U[i,j]*rez[j] od;
rez[i]:=1/U[i,i]*(aux[i]-s)
od;
RETURN(seq(lst[i]=rez[i], i=1..n));
end:
debug(LUsist);
LUsist({x+y-z=2,2*x-y+z=1,x+3*y-2*z=5}, Crout);
{--> enter LUsist, args = {x+y-z = 2, 2*x-y+z = 1, x+3*y-2*z = 5},
Crout
1 1 1 2
eqm := 1 2 1 1
2 1 3 5
lst := {z, x, y}
n := 3
1 1 1
A := 1 2 1
2 1 3
39
b := [2, 1, 5]
1 0 0 1 1 1
lu := 1 3 0 , 0 1 0
2 1 1 0 0 1
1 0 0
L := 1 3 0
2 1 1
1 1 1
U := 0 1 0
0 0 1
s := 0
aux 1 := 2
s := 0
s := 2
aux 2 := 1
s := 0
s := 4
s := 3
aux 3 := 2
s := 0
rez 3 := 2
s := 0
s := 0
rez 2 := 1
s := 0
s := 1
s := 3
rez 1 := 1
40
Pentru aceste sisteme se aplica factorizarea LU. Astfel, matricea A se descompune,
folosind un caz particular al factorizarii Crout, ntr-un produs L U unde:
1 0 0 ... 0 0
a2 2 0 . . . 0 0
L=
(2.11)
0 0 0 . . . n1 0
0 0 0 . . . an n
si
1 2 0 ... 0 0
0 1 3 . . . 0 0
U =
.
(2.12)
0 0 0 . . . 1 n
0 0 0 ... ... 1
Coeficientii a2 , ..., an sunt cunoscuti din matricea A, iar coeficientii i , j se obtin
din definitia nmultirii matricelor:
1 = b1
i i+1 = ci+1 , i = 2, n 1 (2.13)
ai i + i = bi , i = 2, n
Rezolvare
Matricea sistemului este
1 2 0 0
2 1 1 0
A=
0
3 2 1
0 0 2 1
41
Din definitia produsului a doua matrice, obtinem:
b1 = 1 1 1 = 1
c2 = 1 2 2 = 2
b2 = a2 2 + 2 2 = 5
1
c3 = 2 3 3 =
5
13
b3 = a3 3 + 3 3 =
5
5
c4 = 3 4 4 =
13
3
b4 = a4 4 + 4 4 = .
13
B. Rezolvarea sistemelor triunghiulare
Pentru a rezolva sistemul initial, avem de rezolvat doua sisteme triunghiulare:
1 0 0 0 y1 3
2 5 0 0 y2 2
0 3 13 0 y3 = 4 ,
5
3
0 0 2 13 y4 1
a carui solutie este
y1 3
y2 4
5
y3 = 8
,
13
y4 1
si respectiv:
1 2 0 0 x 3
0 1 15 0 y 4
5
5
= 8
,
0 0 1 13 z
13
0 0 0 1 t 1
a cariu solutie este
x 1
y 1
= .
z 1
t 1
42
2.3.4 Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii tridiagonal
Date de iesire: solutia sistemului
Algoritmul consta n:
43
restart: with(linalg):
tridiagonal:=proc(A::matrix)
local i,j,n,a1,l,u;
n:=rowdim(A);
for i from 1 to n do
for j from 1 to i-2 do
if A[i,j]<>0 then
ERROR(matricea nu este tridiagonala!);
fi;
od;
for j from i+2 to n do
if A[i,j]<>0 then
ERROR(matricea nu este tridiagonala!);
fi;
od;
od;
a1:=A;
if a1[1,1]=0 then
ERROR(factorizarea LU nu este aplicabila!);
fi;
for i from n by -1 to 2 do
if det(a1)<>0 then a1:=delrows(delcols(a1,i..i),i..i);
else ERROR(factorizarea LU nu este aplicabila!);
fi;
od;
l:=matrix(n,n,0); u:=matrix(n,n,0);
for i from 1 to n do
u[i,i]:=1;
od;
for i from 2 to n do
l[i,i-1]:=A[i,i-1];
od;
l[1,1]:=A[1,1];
for i from 1 to n-1 do
u[i,i+1]:=A[i,i+1]/l[i,i];
l[i+1,i+1]:=A[i+1,i+1]-A[i+1,i]*u[i,i+1];
od;
RETURN(evalm(l), evalm(u));
end:
nedeterminate:=proc(l::set(equation))
local n,i,j,ops,opst;
44
n:=nops(l);
for i from 1 to n do
ops[i]:=[seq(op(op(l[i])[1])[j] /
coeff(op(l[i])[1],op(indets(op(op(l[i] )[1])[j]))),
j=1..nops(op(l[i])[1]))];
od;
opst:=ops[1];
for i from 1 to n do
for j from 1 to nops(ops[i]) do
if not(ops[i][j] in opst) then
opst:=[op(opst),ops[i][j]]
fi;
od;
od;
RETURN(opst);
end:
tridiagonalsist:=proc(l::set(equation))
local eqm, opst, A, b, n, lu, L, U, i, s, j, aux, rez;
n:=nops(l);
opst:=nedeterminate(l);
eqm:=genmatrix(l, opst, flag);
A:=delcols(eqm,n+1..n+1);
b:=col(eqm,n+1);
lu:=tridiagonal(A);
L:=lu[1];
U:=lu[2];
aux[1]:=b[1]/L[1,1];
for i from 2 to n do
aux[i]:=1/L[i,i]*(b[i]-L[i,i-1]*aux[i-1])
od;
rez[n]:=aux[n];
for i from n-1 by -1 to 1 do
rez[i]:=aux[i]-U[i,i+1]*rez[i+1];
od;
RETURN(seq(opst[i]=rez[i], i=1..n));
end:
debug(tridiagonalsist):
45
1 2 0 0 3
2 1 1 0 2
eqm :=
0
3 2 1 4
0 0 2 1 1
1 2 0 0
2 1 1 0
A :=
0
3 2 1
0 0 2 1
b := [3, 2, 4, 1]
1 2 0 0
1 0 0 0
2 5 0 0 1
0 1 0
13 5
lu := 0 3 0 ,
5
5 0 0 1
13
3
0 0 2
13 0 0 0 1
1 0 0 0
2 5 0 0
13
L := 0 3 0
5
3
0 0 2
13
1 2 0 0
1
0 1 0
5
U :=
5
0 0 1
13
0 0 0 1
aux 1 := 3
4
aux 2 :=
5
8
aux 3 :=
13
aux 4 := 1
rez 4 := 1
rez 3 := 1
rez 2 := 1
rez 1 := 1
46
2.4 Factorizarea Cholesky
2.4.1 Breviar teoretic
Un caz particular de sisteme liniare este acela n care matricea A a sistemului este simet-
rica si pozitiv definita (adica toti determinantii de colt sunt strict pozitivi). Pentru astfel
de sisteme putem folosi un caz particular al factorizarii LU: descompunem matricea A a
sistemului ntr-un produs L LT , unde
11 0 . . . 0
21 22 . . . 0
L= . . . . . . . . . . . . .
(2.14)
n1 n2 . . . nn
Coeficientii ij se obtin din definitia produsului a doua matrice.
47
Se observa ca pentru gasirea elementelor ij , i = 1, n, j = i, n, este suficient sa calculam
dezvoltarile corespunzatoare elementelor aij , i = 1, n, j = i, n.
B. Rezolvarea sistemelor triunghiulare
Pentru a determina solutia sistemului initial, avem de rezolvat doua sisteme triunghi-
ulare:
1 0 0 y1 5
2 1
0
y2 = 11 ,
1 0 2 y3 7
cu solutia
y1 5
y2 = 1 ,
y3 2
si
1 2 1 x 5
0 1
0
y = 1 ,
0 0 2 z 2
cu solutia
x 2
y = 1 .
z 1
2.4.4 Implementare
A. Algoritm
Date de intrare: un sistem de ecuatii
Date de iesire: solutia sistemului
Algoritm
48
v
u i1
u X
ii = taii 2ik
k=1
x = Uy, (2.15)
2v < v, a1 >
a1 = e1 . (2.17)
kvk2
49