Documente Academic
Documente Profesional
Documente Cultură
L ⋅U = A (x.1)
Unde cu L s-a notat o matrice care are valori diferite de zero pozitionate numai pe
diagonala principala si sub aceasta iar cu U o matrice care are valori diferite de zero
numai deasupra diagonalelei principale.
Se fac notatiile:
⎡ α 11 0 ... 0 ⎤ ⎡ β11 β12 ... β1N ⎤
⎢α
⎢ α 22 ... 0 ⎥ ⎥ ⎢ 0 β
⎢ ... β 2 N ⎥⎥
L= 21
U= 22
(x.2)
⎢ ... ... ... ... ⎥ ⎢ ... ... ... ... ⎥
⎢ ⎥ ⎢ ⎥
⎣α N 1 α N 2 ... α NM ⎦ ⎣ 0 0 ... β NM ⎦
Atunci putem utiliza forma A = LU la rezolvarea unui sistem de ecuatii liniare si putem
scrie:
A ⋅ x = (L ⋅ U ) ⋅ x = L ⋅ (U ⋅ x) = b (x.3)
L ⋅ y = b → ca o prima aproximatie
(x.4 x.5)
U ⋅ x = y → forma finala a sistemului
⎧ b
⎪ y1 = 1
⎪ α 11
L⋅ y = b → ⎨ i = 2,.., N (x.6)
⎡ i −1 ⎤
⎪ y i = 1 ⎢bi − ∑ α ij ⋅ y j ⎥
⎪⎩ α ii ⎣ j =1 ⎦
⎧ y
⎪ xN = N
⎪ β N ,N
U ⋅ x = y→⎨ i = N − 1, N − 2,...,1 (x.7)
⎡ N ⎤
⎪ xi = 1 ⎢ y i − ∑ β ij ⋅ x j ⎥
⎪⎩ β ii ⎣ j =i +1 ⎦
1
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
a ij = α i1 β 1 j + .... = a ij
Numarul de termini ai sumei deinde de valorile i si j ale indicilor, astfel:
Deoarece pe diagonala avem atit termenii α cit si β vom avea un numar de N2+N
termeni si doar N2 ecuatii. Astfel putem allege un numar arbitrar de N termeni si
solutiona apoi sistemul de ecuatii. Astfel se aleg termenii:
α ii = 1 i = 1,..., N (x.11)
Se aplica apoi algoritmul Crout, astfel incit rezolvarea problemei de N2+N ecuatii
devine triviala pentru toate necunoscutele α si β din sistemul descries prin aranjarea
ecuatiilor intr-o ordine avantajoasa.
- Se impune α ii = 1 i = 1,..., N
- pentru fiecare j = 1,2,3,…,N se fac urmatorii pasi:
a): pentru i = 1,2,…,j se calculeaza βij folosind (x.8) si (x.9)
i −1
β ij = a ij − ∑ α ik β kj daca i = 1 → ∑ α ik β kj = 0 (x.12)
k =1
1 ⎛ j −1
⎞
α ij = ⎜⎜ aij − ∑ α ik β kj ⎟⎟ (x.13)
β jj ⎝ k =1 ⎠
2
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
Figura f.1 Algoritmul Crout pentru descompunerea matricii A in doua matrici L si U. Elementele matricii
originale sunt modificate in ordinea indicata cu litere mici. Zonele hasurate reprezinta termenii matricii
care sunt utilizati la calculul termenilor notati cu x.
Se observa ca un specific al algoritmului Crout ca atit termenii b cit si a din partea dreapta a
ecuatiilor (x.12) si (x.13) sunt deja determinati pe parcurs ce algoritmul avanseaza iar termenii
matricii A, aij se utilizeaza o singura data si nu se revine asupra lor. Aceasta observatie
permite stocarea matricilor L si U in spatiul alocat matricii A, obtinind astfel economie de
spatiu. La intrarea in procesul de determinare a matricilor triunghiulare se intra cu matricea
coeficientilor sistemului si in final se obtin termenii matricilor L si U sub forma:
⎡ β 11 β 12 ... β 1N ⎤
⎢α
⎢ 21 β 22 ... β 2 N ⎥⎥
(x.14)
⎢ ... ... ... ... ⎥
⎢ ⎥
⎣α N 1 α N 2 ... β NN ⎦
Marirea eficientei algoritmului de calcul se face prin aducerea pe pozitia cea mai avansata a
celui mai mare termen βjj din ecuatia (x.13), proces numit proces de pivotare si care este
esential in asigurarea stabilitatii algoritmului Crout. In programul listat se face interschimbarea
rindurilo astfel incit sa se aduca valoarea cea mai mare pe pozitia pivotului. Este pivotare
partiala, dar suficienta pentru a asigura stabilitatea algoritmului. Pivotarea reprezinta chiar
asigurarea stabilitatii algoritmului Crout. Observam ca in ecuatiile (x.12) si (x.13) esamana
intre ele foarte mult pentru i = j doar ca in ecuatia (x.13) mai apare o impartire la bjj (termenul
3
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
de pa diagonala principala, in acest caz se numeste pivot). Pentru a asigura stabilitatea
algoritmului, trebuie ca impartirea sa fie posibila (bjj <> 0) si sa se obtina o valoare cit mai
mica pentru 1/bjj. Acest lucru se poate face dupa ce totii temenii coloanei au fost calculati si
astfel putem alege termenul aflat pe diagonala maxima aflat pe diagonala principala. Procesul
de aducere a rindului pe care se gaseste valoarea maxima de pe diagonala principala in pozitia
curenta se numeste pivotare partiala, constand in schimbarea intre ele a rindurilor implicate.
Aducerea rindului care contine valoarea maxima pe diagonala principala in lozitia curenta si
inlocuirea lui cu cel din pozitia curenta.
N
det A = ∏ β jj (x.15)
j =1
Din fericire am folosit folosit variabila d pentru a vedea daca rindurile care se schimba intre
ele sunt cu fara sot sau cu sot (pare sau impare), caz in care d a fost +/- 1 dupa caz. Odata ce
am parasit functia LUdcmpB() faptul ca ea contine produsul semnului acestor permutari ne
ajuta si o putem utiliza la memorarea produsului termenilor bjj, ca in urmatoarea secventa de
cod:
int n, j, *indx;
double **a, d, detA;
...........
LUdcmpB(a,n,indx,&d); // Se returneaza d sub foema +/- 1
for (j=1;j<=n;j++) d *= a[i][j];
detA = d;
Variabila d contine acum chiar determinantul matricii originale A. Exista cazuri in care
determinantul depaseste precizia declarata fiind extrem de mare ceea ce conduce la ideea
impartirii acestuia cu puteri ale lui 10 sau a folosirii logaritmilor, ceea ce modifica putin liniile
de cod de mai sus.
4
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
A. Daca matricea A este reala si numai termenul liber are forma complexa, b + id atunci
strategia de lucru este mai simpla.
- se descompune matricea A cu metoda LU, deci se utilizeaza functia LUdcmpB()
- se face retrosubstitutia folosind partea reala a vectorului, deci b si se obtine partea
reala a solutiei
- se face retrosubstitutia folosind partea imaginara a vectorului, deci d si se obtine
partea imaginara a solutiei
B. Daca si matricea A are forma imaginara, atunci sistemul de ecuatii liniare are forma
generala:
( A + i ⋅ C ) ⋅ ( x + i ⋅ y) = (b + i ⋅ d ) (x.16)
Rezolvarea sistemului intr-o maniera mai simpla, fara modificarea functiilor deja scrise pentru
descompunerea LU a matricii sistemului poate fi facuta daca scriem sistemul sub forma reala
si imaginara:
⎧A⋅ x − C ⋅ y = b
⎨ (x.17)
⎩C ⋅ x + A ⋅ y = d
Care poate fi scris ca un set de ecuatii reale avind 2N x 2N ecuatii cu 2N necunoscute, sub
forma:
Α⋅Χ = Β (x.18)
Unde:
A −C ⎧x⎫ ⎧b ⎫
Α= Χ=⎨ ⎬ Β=⎨ ⎬ (x.19)
C A ⎩ y⎭ ⎩d ⎭
Iar rezolvarea cu metoda dezvoltate aici necesita memorarea matricilor A si C de doua ori, iar
sistemul devine unul cu 2N x 2N ecuatii cu 2N necunoscute, ceea ce nu reprezinta un
inconvenient major in cazul multor aplicatii ingineresti.
Listingul programului.
5
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
int i,imax,j,k;
double big,dum,sum,temp;
double *vv; // memoreaza scalarea fiecarui rind al matricii
vv=d1double(1,n);
*d=1.0; // nu se schimba pozitia nici unui rind
for (i=1;i<=n;i++) { // ciclarea rindurilor pentru inf. initiale
big=0.0;
for (j=1;j<=n;j++)
if ((temp=fabs(a[i][j])) > big) big=temp;
if (big == 0.0){
//nrerror("Singular matrix in routine ludcmp"); //
toate elem. sunt nule
printf("matrice singulara \n");
exit(1);
}
vv[i]=1.0/big;
} // salvarea scalarii
6
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
for (i=j+1;i<=n;i++) a[i][j] *= dum;
}
} // Inapoi
pentru urmatorul rind
free_d1double(vv,1);
} // end func LUdecB()
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#include "mem_g_Allocare.h"
#define NR_END = 1;
#define TINY 1.0e-20;
#define EPS 1.0e-4
double det;
7
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
/*-------------------------------------------------------------*/
/* Metoda factorizarii LU ptr. rezolvare a sis. lin. de ec. */
/*-------------------------------------------------------------*/
/* sistemul sub forma matriciala A X = b */
/* solutia se gaseste in B */
/* A[n][n] se descompune in matricile triunghiuare L si U */
/* *det valarea determinantului matricii A */
/* intoarce 0 -> solutia sistemului */
/* 1 -> matricea este singulara */
/*-------------------------------------------------------------*/
void main(void)
{
int i,j;
int n,m;
double d, **a, **b;
// int succes;
int *indx;
// double d;
8
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
printf("-----------------------------------------------------------
\n");
printf("Alege metoda iMet = ");scanf("%d",&iMet);
ety10:
iTry++;
if ((iTry > 0 && iTry <= 4) && (iTry <= iTryMax)) {
printf ("S-a ales iMet = %d \n",iMet);
printf ("Din incercarea iTry = %d \n",iTry);
}else{
printf("S-a introdus valoarea neacceptata pentru iMet \n");
printf("----------------------------------------------\n");
printf(" iMet > 0 si iMet <=4 \n");
printf(" iTry = %d din iTryMax = %d \n",iTry,iTryMax);
if (iTry <= iTryMax) goto ety10;
exit(1);
}
if (iMet == 1){
n = 3;
m=3;
a = m2ddouble(1,n,1,n);
b = m2ddouble(1,n,1,m);
pr = fopen("rezultateLU.txt ","a");
indx=d1int(1,n);
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
printf("a[%d][%d] = %f ",i,j,a[i][j]);
fprintf(pr,"a[%d][%d] = %f ",i,j,a[i][j]);
}
printf(" \n");
fprintf(pr," \n");
}
9
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
fprintf(pr,"Termenii liberi ai sistemelor b[%i][%i] \n",n,n);
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
printf("b[%d][%d] = %f ",i,j,b[i][j]);
fprintf(pr,"b[%i][%i] = %f ",i,j,b[i][j]);
}
printf(" \n");
fprintf(pr,"\n");
}
LUdecB(a, n, indx, &d);
for (j=1;j<=n;j++) d *= a[j][j];
printf("Determinantul matricii A: detA=%f\n",d);
fprintf(pr,"/n/n Determinantul matricii A detA = %f \n\n",d);
10
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
printf("a[%d][%d] = %f ",i,j,a[i][j]);
fprintf(pr,"a[%d][%d] = %f ",i,j,a[i][j]);
}
printf(" \n");
fprintf(pr," \n");
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
printf("b[%d][%d] = %f ",i,j,b[i][j]);
fprintf(pr,"b[%i][%i] = %f ",i,j,b[i][j]);
}
printf(" \n");
fprintf(pr,"\n");
}
LUdecB(a, n, indx, &d);
LUbksbB(a, n, m, indx, b);
11
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
a = m2ddouble(1,n,1,n);
// b = m2ddouble(1,n,1,m);
pr = fopen("rezultateLU.txt ","a");
indx=d1int(1,n);
//……………………………………………………………………………..
if (iMet == 4){
n = 3;
m=3;
double **imd;
a = m2ddouble(1,n,1,n);
b = m2ddouble(1,n,1,m);
imd = m2ddouble(1,n,1,m);
pr = fopen("rezultateLU.txt ","a");
indx=d1int(1,n);
// Matricea A[][]
for (i=1;i<=n;i++){
for (j=1;j<=n;j++){
printf("a[%d][%d] = %f ",i,j,a[i][j]);
fprintf(pr,"a[%d][%d] = %f ",i,j,a[i][j]);
}
printf(" \n");
fprintf(pr," \n");
}
12
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
fprintf(pr,"Termenii liberi ai sistemelor b[%i][%i] + i imd
\n",n,n);
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
printf("\t b %f + imd = %f \t",b[i][j],imd[i][j]);
fprintf(pr,"\t b = %f + imd = %f
\t",b[i][j],imd[i][j]);
}
printf(" \n");
fprintf(pr,"\n");
}
LUdecB(a, n, indx, &d);
for (j=1;j<=n;j++) d *= a[j][j];
printf("Determinantul matricii A: detA=%f\n",d);
fprintf(pr,"/n/n Determinantul matricii A detA = %f \n\n",d);
free_d2double(a,1,1);
free_d2double(b,1,1);
free_d2double(imd,1,1);
// iesire cu numar
printf("apasa un numar \n");
scanf("%d",&i);
exit(1);
}
if (iMet == 5){
n = 3;
m=3;
realA = m2ddouble(1,n,1,n);
imagC = m2ddouble(1,n,1,n);
realB = m2ddouble(1,n,1,m);
imagD = m2ddouble(1,n,1,m);
13
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
AA = m2ddouble(1,2*n,1,2*n);
BB = m2ddouble(1,2*n,1,m);
pr = fopen("rezultateLU.txt ","a");
indx=d1int(1,n);
//……………………………………………………………..
//……………………………………………………………….
} // end main()
Rezultate test
Date de intrare...Metoda LU
Matricea necunoscutelor A[3][3]
a[1][1] = 5.000000 a[1][2] = 2.600000 a[1][3] = 3.700000
a[2][1] = 2.200000 a[2][2] = 7.000000 a[2][3] = 4.100000
a[3][1] = 1.500000 a[3][2] = 5.200000 a[3][3] = 12.000000
Termenii liberi ai sistemelor b[3][3]
b[1][1] = 1.000000 b[1][2] = 2.000000 b[1][3] = 4.000000
b[2][1] = 10.000000 b[2][2] = 20.000000 b[2][3] = 90.000000
b[3][1] = 100.000000 b[3][2] = 200.000000 b[3][3] = 400.000000
/n/n Determinantul matricii A detA = 264.228000
Date de intrare...
Matricea necunoscutelor A[3][3]
a[1][1] = 5.000000 a[1][2] = 2.600000 a[1][3] = 3.700000
14
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
a[2][1] = 2.200000 a[2][2] = 7.000000 a[2][3] = 4.100000
a[3][1] = 1.500000 a[3][2] = 5.200000 a[3][3] = 12.000000
Termenii liberi = Matricea Unitate b[3][3]
b[1][1] = 1.000000 b[1][2] = 0.000000 b[1][3] = 0.000000
b[2][1] = 0.000000 b[2][2] = 1.000000 b[2][3] = 0.000000
b[3][1] = 0.000000 b[3][2] = 0.000000 b[3][3] = 1.000000
Optiunea 4: Rezolvarea sist. ec. liniare complexe A x (X+iY) = (B + iD) prin descompunerea
LU
Date de intrare...Metoda LU
Matricea necunoscutelor A[3][3]
a[1][1] = 5.000000 a[1][2] = 2.600000 a[1][3] = 3.700000
a[2][1] = 2.200000 a[2][2] = 7.000000 a[2][3] = 4.100000
a[3][1] = 1.500000 a[3][2] = 5.200000 a[3][3] = 12.000000
Termenii liberi ai sistemelor b[3][3] + i imd
b = 1.000000 + imd = 0.100000 b = 2.000000 + imd = 0.200000
b = 4.000000 + imd = 1.000000
b = 10.000000 + imd = 1.100000 b = 20.000000 + imd = 1.300000
b = 90.000000 + imd = 1.500000
b = 100.000000 + imd = 5.100000 b = 200.000000 + imd = 6.300000
b = 400.000000 + imd = 8.200000
/n/n Determinantul matricii A detA = 264.228000
15
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
i=1
-5.983166 + i -0.320223 -11.966332 + i -0.374767 -
26.195861 + i -0.303632
i=2
-2.693696 + i -0.019551 -5.387393 + i -0.042134 -0.471184
+ i -0.151108
i=3
10.248498 + i 0.473500 20.496995 + i 0.590104 36.811996
+ i 0.786767
------------------------------------------
Optiunea 5: Rezolvarea sist. ec. liniare complexe (A+iC) x (X+iY) = (B + iD) prin
descompunerea LU
Date de intrare...Metoda LU
Matricea necunoscutelor A[3][3]
a[1][1] = 5.000000 a[1][2] = 2.600000 a[1][3] = 3.700000 a[1][4] = -7.000000 a[1][5] = -
5.200000 a[1][6] = -6.300000
a[2][1] = 2.200000 a[2][2] = 7.000000 a[2][3] = 4.100000 a[2][4] = -3.200000 a[2][5] = -
4.200000 a[2][6] = -5.200000
a[3][1] = 1.500000 a[3][2] = 5.200000 a[3][3] = 12.000000 a[3][4] = -2.200000 a[3][5] = -
8.800000 a[3][6] = -6.300000
a[4][1] = 7.000000 a[4][2] = 5.200000 a[4][3] = 6.300000 a[4][4] = 5.000000 a[4][5] =
2.600000 a[4][6] = 3.700000
a[5][1] = 3.200000 a[5][2] = 4.200000 a[5][3] = 5.200000 a[5][4] = 2.200000 a[5][5] =
7.000000 a[5][6] = 4.100000
a[6][1] = 2.200000 a[6][2] = 8.800000 a[6][3] = 6.300000 a[6][4] = 1.500000 a[6][5] =
5.200000 a[6][6] = 12.000000
Termenii liberi ai sistemelor b[3][3]
b[1][1] = 1.000000 b[1][2] = 2.000000 b[1][3] = 4.000000
b[2][1] = 10.000000 b[2][2] = 20.000000 b[2][3] = 90.000000
b[3][1] = 100.000000 b[3][2] = 200.000000 b[3][3] = 400.000000
b[4][1] = 0.870000 b[4][2] = 3.200000 b[4][3] = 2.000000
b[5][1] = 2.300000 b[5][2] = 0.320000 b[5][3] = 0.120000
b[6][1] = 1.200000 b[6][2] = 4.300000 b[6][3] = 0.430000
16
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU
Bibliografie
.
.
17