CATEGORII DOCUMENTE |
Astronomie | Biofizica | Biologie | Botanica | Carti | Chimie | Copii |
Educatie civica | Fabule ghicitori | Fizica | Gramatica | Joc | Literatura romana | Logica |
Matematica | Poezii | Psihologie psihiatrie | Sociologie |
Fie sistemul compatibil determinat
Ax = b.
unde
Factorizarea LU presupune descompunerea matricei A intr-un produs de matrice L U , unde
, ( 2.5 )
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
(2.7)
si
Ux = y (2.8)
cu solutia
(2.9)
Exercitiul 1 Sa se determine solutia sistemului urmator, folosind factorizarea LU:
Sistemul se scrie in forma matriceala:
Ax = b
unde
,
Deoarece
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
si ne propunem sa determinam coeficientii lij, ujk. Pentru aceasta, folosim definitia inmultirii matricelor. Astfel, avem:
a = λ11 1 λ11 = 1
a = λ11 12 12 = 1
a = λ11 13 13 = −1
a = λ21 1 λ21 = 2
a = λ21 12 + λ22 1 λ22 = −3
a 23 = −1
a λ31 = 1
a λ32 = 2
a λ33 = 1
sau
B. Rezolvarea sistemelor triunghiulare
Pentru rezolvarea sistemului initial, avem de rezolvat doua sisteme triunghiulare:
a carui solutie este
si respectiv:
a carui solutie este
REZOLVARE FOLOSIND FACTORIZAREA DOOLITTLE
A. Factorizarea Doolittle
Presupunem ca
si ne propunem sa determinam coeficientii lij, jk, la fel ca si in exemplul precedent. Astfel avem:
a = 1 11 11 = 1
a = 1 12 12 = 1
a = 1 13 13 = −1
a = λ21 11 λ21 = 2
a = λ21 12 + 1 22 22 = −3
a 23 = 3
a λ31 = 1
a 22 λ32 =
a 33 = 1
sau
B. Rezolvarea sistemelor triunghiulare
Pentru rezolvarea sistemului initial, avem de rezolvat doua sisteme triunghiulare:
,
a carui solutie este
si respectiv:
a carui solutie este
A. Algoritm
Date de intrare: un sistem de ecuatii.
Date de iesire: solutia sistemului
Algoritmul consta din urmatoarele etape:
1. generarea matricei A a sistemului, si a vectorului coloana b
. n = numarul de linii ale matricei A (numarul de ecuatii ale sistemului)
2. a) factorizarea Crout
pentru i =
ii = 1
pentru i =
pentru j =
pentru j =
b) factorizarea Doolittle
pentru i =
λii = 1
pentru i =
pentru j =
pentru j =
3. Rezolvarea celor doua sisteme triunghiulare
pentru i =
pentru i =
B. Programe MAPLE si rezultate
Deoarece cele doua variante ale descompunerii LU difera doar prin modul de factorizare a matricei sistemului, am implementat separat cele doua variante de factorizare: LUcrout si LUdoolittle, dupa care le-am folosit ca optiuni in procedura finala LUsist
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;
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:
LUdoolittle := 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
l[i, i] := 1;
od;
for i from 1 to n do
for j from 1 to i-1 do
s := 0;
for k from 1 to i do
s := s + l[i, k]*u[k, i];
od;
l[i, j] := 1/u[j, j]*(A[i, j] - s);
od;
for j from i to n do
s := 0;
for k from 1 to i-1 do
s := s + l[i, k]*u[k, i];
od;
u[i, j] := 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 (, Doolittle);
Doolittle
lst := n := 3
s := 0 aux 1 := 2 s := 0 s := −2 aux 2 := 3
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
<-- exit LUsist (now at top level) = z = 1, x = 1, y = 2}
z = 1, x = 1, y = 2
> LUsist(, Crout);
, Crout
lst := n := 3
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
<-- exit LUsist (now at top level) = z = 1, x = 1, y = 2} z = 1, x = 1, y = 2
Programul pentru factorizarea LU prin limbajul C++
# include<iostream.h>
# include<math.h>
# include<conio.h>
int n, m, i, j, k, p, t;
double a[10][11], y[10], x[10], max, s;
void main (void)
cout<<"Introduceti termenii liberi;"<<endl;
for (i = 1; i <= n; i++)
k = 1;
t = 0;
do
max = fabs(a[k][k]);
p = k;
for (i = k+1; i <= n; i++)
if (max<fabs(a[i][k]))
if (max = = 0)
t = 1;
else
for (j = k+1; j <= n; j++)
k++;}}
while ((k<=n)&&(t = = 0));
if ((t = =1) | | (a[n][n] = = 0.0))
cout<<"Sistemul nu este compatibil determinat!"<<endl'
else
for (i = 1; i <= n; i++)
for (i = n; i > 0; i--)
cout.precision(0);
cout<<"Solutia sistemului:"<<end;
for (i = 1; i <= n; i++)
cout<<"x("<<i<<")="<<setw(12)<<x[i]<<endl;
}
getch ( );
}
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 7616
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved