Sunteți pe pagina 1din 17

Laborator3. Analiza numerica avansata.

Metoda descompunerii in matrici triunghiulare


Descompunerea LU
Metoda factorizarii LU

Daca putem sa scriem o matrice A sub forma:

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)

Ceea ce daca se introduce un vector intermediary y care sa defineasca produsul


scalar dintre U si x conduce la:

L ⋅ y = b → ca o prima aproximatie
(x.4 x.5)
U ⋅ x = y → forma finala a sistemului

Care ar putea fi avantajele acestei complicatii ?


Devine foarte avantajoasa utilizarea doar a substitutiei inverse pentru Ux=y si se
reduce metoda substitutiei directe pentru Ly=b ceea ce usureaza mult metoda de
rezolvare, de determinare a determinantului si de gasire a inversei matricii A pentru
marea majoritate a aplicatiilor.

⎧ 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

Realizarea descompunerii in matrici triunghiulare


Sa scriem componenta aij asa cum rezulta din produsul matricilor L si U

a ij = α i1 β 1 j + .... = a ij
Numarul de termini ai sumei deinde de valorile i si j ale indicilor, astfel:

i < j → α i1 β 1 j + α i 2 β 2 j + .... + α ii β ij = aij


i = j → α i1 β1 j + α i 2 β 2 j + .... + α ii β jj = aij (x.8,x.9,x.10)
i > j → α i1 β1 j + α i 2 β 2 j + .... + α ij β jj = aij

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

Astfel pentru i = 1, termenii sumei din ec. (x.12) se considera nuli.


b): pentru i=j+1,j+2,…,N daca (i > j) atunci se foloseste ec. (x.10) pentru
a determina termenii αij.

1 ⎛ j −1

α ij = ⎜⎜ aij − ∑ α ik β kj ⎟⎟ (x.13)
β jj ⎝ k =1 ⎠

- Se trece la urmatorul pas dupa j

Modul de lucru al algoritmului poate fi reprezentat grafic astfel:

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.

Inversarea unei matrici utilizind descompunerea LU


Folosind descompunerea LU si retrosubstitutia, se poate obtine cu usurinta si matricea inverse
a matricii A, daca pentru fiecare coloana in procesul de retrosubstitutie, se impune ca sa avem
valoarea 1.
Deci functia LUdcmpB() va fi apelata o singura data in timp ce prin impunerea valorii 1
pentru vectorul coloanei curente, in pozitia curenta cu LUbksbB() se obtine in final valoarea
inversa a amtricii A prin parcurgerea tuturor coloanelor din matrice.

Calculul determinantului unei matrici folosind metoda descompunerea LU


Feterminantul matricii A poate fi calculat in urma descompunerii LU prin inmultirea
termenilor de pe diagonala principala a matricii obttinuta in urma procesului de
descompunere:

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

Sisteme de ecuatii liniare complexe rezolvate cu metoda descompunerii


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.

void LUdecB(double **a, int n, int *indx, double *d)


/*---------------------------------------------------------------------*/
/* pentru o matrice a[1..n][1..n], se realizeaza descompunerea LU in */
/* matricile triunghiulare superioara si inferioara sub forma generala */
/* index[1..n] vectorul care memoreaza pozitia rindurilor afectate de */
/* permutarile ce aduc pivotul cel mai semnificativ */
/* d o variabila de iesire +/- depinzind de valoarea noua/veche */
/* functia se foloseste impreuna cu lubkap() pentru sisteme liniare sau */
/* inversarea matricilor
*/
/*-----------------------------------------------------------------------*/
{

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

for (j=1;j<=n;j++) { // ciclul Crout pe coloanele matricii


ec(x.12)
for (i=1;i<j;i++) {
sum=a[i][j];
for (k=1;k<i;k++) sum -= a[i][k]*a[k][j];
a[i][j]=sum;
}

big=0.0; // cautarea pivotului (val. max.)


pe fiecare rind
for (i=j;i<=n;i++) { // pe rindurile i=j...N
sum=a[i][j];
for (k=1;k<j;k++)
sum -= a[i][k]*a[k][j];
a[i][j]=sum;
if ( (dum=vv[i]*fabs(sum)) >= big) { // se alege
pivotul ?
big=dum;
imax=i;
}
}
if (j != imax) { // se face schimbarea
rindurilor ?
for (k=1;k<=n;k++) { // Da, atunci fa modificarea
in matricea A
dum=a[imax][k];
a[imax][k]=a[j][k];
a[j][k]=dum;
}
*d = -(*d); // schimba paritatea
vv[imax]=vv[j];
}
indx[j]=imax;
if (a[j][j] == 0.0) a[j][j]=TINY; // Matricea poate fi
singulara
if (j != n) {
dum=1.0/(a[j][j]); // Se imparte la
pivot

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()

void LUbksbB(double **a, int n,int m, int *indx, double **b)


/*-----------------------------------------------------------*/
/* rezolvarea sistemului liniar A[][] X[] = B[][] */
/* A este matricea prelucrata prin triunghiularizare sup si */
/* inferioara de ludcmp. Termenii ambelor matrici s-au salvat*/
/* intr-o singura matrice, matrice care a inlocuit-o pe cea */
/* initiala.
*/
/* */
/*-----------------------------------------------------------*/
{
int i,ii=0,ip,j,k;
double sum;
for (k=1;k<=m;k++){
for (i=1;i<=n;i++) {
ip=indx[i];
sum=b[ip][k];
b[ip][k]=b[i][k];
if (ii)
for (j=ii;j<=i-1;j++) sum -= a[i][j]*b[j][k];
else if (sum) ii=i; // a fost gasit un element
diferit de zero
b[i][k]=sum; // se face insumarea
elementelor
}
for (i=n;i>=1;i--) { // se face retrosubstitutia
ec.(x.7)
sum=b[i][k];
for (j=i+1;j<=n;j++) sum -= a[i][j]*b[j][k];
b[i][k]=sum/a[i][i]; // se memoreeaza solutia in
vectorul necunoscutelor
}
}
} // end func LUbksbB()

#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;

void LUdecB(double **a, int n, int *indx, double *d);


void LUbksbB(double **a, int n, int m, int *indx, double **b);

void free_m2ddouble(double **m,int nrl,int nrh,int ncl,int nch);


void free_m1ddouble(double *v,int nl,int nh);
void free_d1int(int *p,int imin);

double **m2ddouble(int nrl,int nrh,int ncl,int nch);


double *m1ddouble(int nl,int nh);
int *d1int(int imin,int imax);

// int gauss(double **a, double **b , int n, int m, double det);


int iTry, iTryMax, iTryMat, iMet;

// Atribuire memorie pentru a,b,det


iTryMat = 4;
iTry = 0;
iTryMax = 10;
FILE *pr;

printf("Utilizarea descompunerii LU a unei matrici A \n");


printf("-----------------------------------------------------------
\n");
printf("1...Solutia sistemului ec. liniare A[][] x X[] = B[][]
\n");
printf("2...Calculul Inv[][] == Inversei matricii A[][]
\n");
printf("3...Calculul determinantului DET matricii A[][]
\n");
printf("4...Calculul sist. de ec. complexe A x (X+iY) = (B+iD)
\n");
printf("5...Calculul sist. de ec. complexe (A+iC)(X+iY) = (B+iD)
\n");

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);

printf("Optiunea %d:: Rezolvarea sistemulu A x X = B prin


descompunerea LU \n",iMet);
fprintf(pr,"Optiunea %d:: Rezolvarea sistemulu A x X = B prin
descompunerea LU \n",iMet);
printf(" \n\n");
fprintf(pr," \n\n");

a[1][1] = 5.; a[1][2] = 2.6; a[1][3] = 3.7;


a[2][1] = 2.2; a[2][2] = 7.; a[2][3] = 4.1;
a[3][1] = 1.5; a[3][2] = 5.2; a[3][3] = 12.;

b[1][1] = 1.; b[1][2] = 2.; b[1][3] = 4.;


b[2][1] = 10.; b[2][2] = 20.; b[2][3] = 90.;
b[3][1] = 100.; b[3][2] = 200.; b[3][3] = 400.;
printf("/n Intrari a(i,j) b(i,j)\n");

fprintf(pr," Date de intrare...Metoda LU \n");


fprintf(pr,"Matricea necunoscutelor A[%i][%i] \n",n,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");
}

printf("Intrari b(i,j) b(i,j)\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);

LUbksbB(a, n, m, indx, b);

printf("\n Rezultate b(i,j)\n\n");


fprintf(pr,"\n Rezultate finale Solutia sistemului A x = B \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");
}
printf(" ---------------------------------------------\n");
fprintf(pr,"------------------------------------------\n");
fclose (pr);
// Eliberarea memoriei
free_d2double(a,1,1);
free_d2double(b,1,1);

printf("apasa un numar \n");


// scanf("%d",&i);
exit(1);
}
if (iMet == 2){
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);

printf("Optiunea %d: Calculul inversei matricii A prin


descompunerea LU \n",iMet);
fprintf(pr,"Optiunea %d: Calculul inversei matricii A prin
descompunerea LU \n",iMet);
printf(" \n\n");
fprintf(pr," \n\n");

a[1][1] = 5.; a[1][2] = 2.6; a[1][3] = 3.7;


a[2][1] = 2.2; a[2][2] = 7.; a[2][3] = 4.1;
a[3][1] = 1.5; a[3][2] = 5.2; a[3][3] = 12.;

10
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU

b[1][1] = 1.; b[1][2] = 0.; b[1][3] = 0.;


b[2][1] = 0.; b[2][2] = 1.; b[2][3] = 0.;
b[3][1] = 0.; b[3][2] = 0.; b[3][3] = 1.;
printf("/n Intrari a(i,j) b(i,j)\n");

fprintf(pr," Date de intrare... \n");


fprintf(pr,"Matricea necunoscutelor A[%i][%i] \n",n,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");
}

printf("Intrari b(i,j) \n");


fprintf(pr,"Termenii liberi = Matricea Unitate 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);
LUbksbB(a, n, m, indx, b);

printf("\n Rezultate: Matricea Inversa \n\n");


fprintf(pr,"\n Rezultate finale Matricea Inversa \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");
}
printf("================================================== \n");
fprintf(pr,"==============================================\n");
fclose (pr);
// Eliberarea memoriei
free_d2double(a,1,1);
free_d2double(b,1,1);

printf("apasa un numar \n");


scanf("%d",&i);
exit(2);
}
if (iMet == 3){
n = 3;
m=3;

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);

printf("Optiunea %d: Rezolvarea sist. ec. liniare complexe A x


(X+iY) = (B + iD) prin descompunerea LU \n",iMet);
fprintf(pr,"Optiunea %d: Rezolvarea sist. ec. liniare complexe A
x (X+iY) = (B + iD) prin descompunerea LU \n",iMet);
printf(" \n\n");
fprintf(pr," \n\n");

// Matricea A[][]

a[1][1] = 5.; a[1][2] = 2.6; a[1][3] = 3.7;


a[2][1] = 2.2; a[2][2] = 7.; a[2][3] = 4.1;
a[3][1] = 1.5; a[3][2] = 5.2; a[3][3] = 12.;
// Matricea termenilor liberi pentru m cazuri de incarcari
// B[1..n][1..m] + iD[1..n][1..m]

b[1][1] = 1.; b[1][2] = 2.; b[1][3] = 4.;


b[2][1] = 10.; b[2][2] = 20.; b[2][3] = 90.;
b[3][1] = 100.; b[3][2] = 200.; b[3][3] = 400.;
// Partea imaginara a termenului incarcarilor: D[1..n][1..m]
imd[1][1] = 0.1; imd[1][2] = 0.2; imd[1][3] = 1.;
imd[2][1] = 1.1; imd[2][2] = 1.3; imd[2][3] = 1.5;
imd[3][1] = 5.1; imd[3][2] = 6.3; imd[3][3] = 8.2;

printf("/n Intrari a(i,j) b(i,j)+i imd(i,j)\n");

fprintf(pr," Date de intrare...Metoda LU \n");


fprintf(pr,"Matricea necunoscutelor A[%i][%i] \n",n,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");
}

printf("Intrari b(i,j) + imd(i,j)\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);

LUbksbB(a, n, m, indx, b);


LUbksbB(a, n, m, indx, imd);

printf("\n Rezultate b(i,j)\n\n");


fprintf(pr,"\n Rezultate finale Solutia sistemului A x = B + i D
\n");
for (i=1;i<=n;i++){
printf(" i = %d \n",i);
fprintf(pr," i = %d \n",i);
for (j=1;j<=m;j++){
printf("\t %f + i %f \t",b[i][j],imd[i][j]);
fprintf(pr,"\t %f + i %f \t",b[i][j],imd[i][j]);
}
printf(" \n");
fprintf(pr,"\n");
}
printf(" ---------------------------------------------\n");
fprintf(pr,"------------------------------------------\n");
fclose (pr);
// eliberare memorie

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;

double **realA, **realB, **imagC, **imagD;


double **AA, **BB;

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);

printf("Optiunea %d: Rezolvarea sist. ec. liniare complexe


(A+iC) x (X+iY) = (B + iD) prin descompunerea LU \n",iMet);
fprintf(pr,"Optiunea %d: Rezolvarea sist. ec. liniare complexe
(A+iC) x (X+iY) = (B + iD) prin descompunerea LU \n",iMet);
printf(" \n\n");
fprintf(pr," \n\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

Rezultate finale Solutia sistemului A x = B


b[1][1] = -5.983166 b[1][2] = -11.966332 b[1][3] = -26.195861
b[2][1] = -2.693696 b[2][2] = -5.387393 b[2][3] = -0.471184
b[3][1] = 10.248498 b[3][2] = 20.496995 b[3][3] = 36.811996
------------------------------------------
Optiunea 2: Calculul inversei matricii A prin descompunerea LU

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

Rezultate finale Matricea Inversa


b[1][1] = 0.237219 b[1][2] = -0.045264 b[1][3] = -0.057677
b[2][1] = -0.076638 b[2][2] = 0.206072 b[2][3] = -0.046778
b[3][1] = 0.003558 b[3][2] = -0.083640 b[3][3] = 0.110813
==============================================
Optiunea 3: Calculul determinantului matricii A prin descompunerea LU

Date de intrare...LU calcul Determinant


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

Determinantul detA = 264.228000


a[1][1] = 5.000000 a[1][2] = 2.600000 a[1][3] = 3.700000
a[2][1] = 0.440000 a[2][2] = 5.856000 a[2][3] = 2.472000
a[3][1] = 0.300000 a[3][2] = 0.754781 a[3][3] = 9.024180

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

Rezultate finale Solutia sistemului A x = B + i D

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

Rezultate finale Solutia sistemului (A+iC) x (x+iy)= (b+id)


i=1
-5.572511 + i(1.477415) -10.774180 + i(3.197929) -24.175077 + i(8.923167)
i=2
-2.966361 + i(-1.961215) -5.800382 + i(-4.889109) -2.704934 + i(-8.228367)
i=3
8.802022 + i(-0.658920) 17.159097 + i(-0.702440) 29.634546 + i(-6.656358)
------------------------------------------

16
Laborator3. Analiza numerica avansata. Metoda descompunerii in matrici triunghiulare
Descompunerea LU

Bibliografie

- Stoer, J., and Bulirsch, R. 1980, Introduction to Numerical Analysis (New


York: Springer-Verlag), §4.2.
- Westlake, J.R. 1968, A Handbook of Numerical Matrix Inversion and
Solution of Linear Equations (New York: Wiley).
- Horn, R.A., and Johnson, C.R. 1985, Matrix Analysis (Cambridge:
Cambridge University Press)
- Golub, G.H., and Van Loan, C.F. 1989, Matrix Computations, 2nd ed.
(Baltimore: Johns Hopkins University Press), Chapter 4.
- Dongarra, J.J., et al. 1979, LINPACK User’s Guide (Philadelphia: S.I.A.M.).
- Forsythe, G.E., Malcolm, M.A., and Moler, C.B. 1977, Computer Methods
for Mathematical Computations (Englewood Cliffs, NJ: Prentice-Hall), §3.3,
and p. 50
- Forsythe, G.E., and Moler, C.B. 1967, Computer Solution of Linear
Algebraic Systems (Englewood Cliffs, NJ: Prentice-Hall), Chapters 9, 16,
and 18.
- Ralston, A., and Rabinowitz, P. 1978, A First Course in Numerical Analysis,
2nd ed. (New York: McGraw-Hill), §9.11

.
.

17

S-ar putea să vă placă și