Вы находитесь на странице: 1из 26

Descomposicin LU e inversin de matrices

DESCOMPOSICIN LU

a11
a21
a31
.
.
.
an1

a12 a13. . . a1m


a22 a23. . . a2m
a32 a24. . . a3m
.
.
.
an2 an3. . . anm

Su nombre se deriva de las palabras inglesas lower y upper, que en espaol se


traducen como inferior y superior. Estudiando el proceso que se sigue en la
descomposicin LU es posible comprender l porque de este nombre, analizando
como una matriz original

se descompone en dos matrices triangulares, una

superior y otra inferior.


La descomposicin LU involucra solo operaciones sobre los coeficientes de la
matriz [A], proporcionando un medio eficiente para calcular la matriz inversa o
resolver sistemas de algebra lineal.
Primeramente se debe obtener la matriz [L] y la matriz [U].
[L] es una matriz diagonal inferior con nmeros 1 sobre la diagonal. [U] es una
matriz diagonal superior no necesariamente tiene que haber nmeros 1.
El primer paso es descomponer o transformar [A] en [L] y [U], es decir obtener la
matriz triangular inferior [L] y la matriz triangular superior [U].

PASOS PARA ENCONTRAR LA MATRIZ TRIANGULAR SUPERIOR (MATRIZ [U])


1. Hacer cero todos los valores abajo del pivote sin convertir este en 1.
2.

Para lograr lo anterior se requiere obtener un factor el cual es necesario


para convertir a cero los valores abajo del pivote.

3. Dicho factor es igual al nmero que se desea convertir en cero entre el


nmero pivote.

4. Este factor multiplicado por -1 se multiplica luego por el pivote y a ese


resultado se le suma el valor que se encuentra en la posicin a cambiar (el
valor

en

la

posicin

que

se

convertir

en

cero).

Esto

es:

- factor * pivote + posicin a cambiar

PASOS PARA ENCONTRAR LA MATRIZ TRIANGULAR INFERIOR (MATRIZ [L])


Para encontrar la matriz triangular inferior se busca hacer ceros los valores de
arriba de cada diagonal, as como tambin convertir en 1 cada diagonal. Se
utiliza el mismo concepto de factor explicado anteriormente y se ubican todos
los factores debajo de la diagonal segn corresponda en cada uno.

Originalmente se tena:

Debido a que [A] = [L][U], al encontrar [L] y [U] a partir de [A] no se altera en nada
la ecuacin y se tiene lo siguiente:

Por lo tanto, si Ax = b, entonces LUx = b, de manera que Ax = LUx = b.

PASOS PARA RESOLVER UN SISTEMA DE ECUACIONES POR EL MTODO DE


DESCOMPOSICIN LU
1. Obtener la matriz triangular inferior L y la matriz triangular superior U.
2. Resolver Ly = b (para encontrar y).
3. El resultado del paso anterior se guarda en una matriz nueva de nombre "y".
4. Realizar Ux = y (para encontrar x).
5. El resultado del paso anterior se almacena en una matriz nueva llamada "x",
la cual brinda los valores correspondientes a las incgnitas de la ecuacin.

INVERSIN DE MATRICES
La matriz inversa de A es otra matriz que representamos por A -1 y que verifica:

Solamente tienen inversa las matrices cuadradas cuyo determinante es distinto de


cero

CALCULO DE LA INVERSA

Para calcular la inversa en forma de columna, la mejor manera es realizar un


clculo como este es con el algoritmo de descomposicin de LU, una de las
ventajas de este es que proporciona un medio eficiente para evaluar diversos
vectores de lado derecho por lo tanto, resulta ideal para evaluar los vectores
unitarios requeridos en el clculo de la inversa.

EJEMPLO DE DESCOMPOSICIN LU
PROBLEMA: Encontrar los valores de x1, x2 y x3 para el siguiente sistema de
ecuaciones:

NOTA: Recurdese que si la matriz es 2x2 se har 1 iteracin; si es 3x3, 2


iteraciones; si es 4x4, 3 iteraciones; y as sucesivamente.
SOLUCIN:
4

-2 -1

[A] = 5

-1

-4

ITERACIN 1
Factor 1 = (a21 / a11) = 5 / 4 = 1.25
Factor 2 = (a31 / a11) = 1 / 4 = 0.25
Encontrando [U]
Fila 2 = - (factor 1) * (fila 1) + (fila 2)
Fila 3 = - (factor 2) * (fila 1) + (fila 3)
a11 = a11

9
[B] =

7
12

a12 = a12
a13 = a13
a21 = - (1.25) * (4) + (5) = 0
a22 = - (1.25) * (- 2) + (1) = 3.5
a23 = - (1.25) + (- 1) + (- 1) = 0.25
a31 = - (0.25) * (4) + (1) = 0
a32 = - (0.25) * (- 2) + (2) = 2.5
a33 = - (0.25) * (- 1) + (- 1) = - 0.75

-2

-1

3.5

0.25

2.5 - 0.75

[L] = 1.25

0.25

[U] =

Encontrando [L]

ITERACIN 2
Factor 3 = (u32 / u22) = 2.5 / 3.5 = 0.7142857143
Encontrando [U]
Fila 3 = - (factor 3) * (fila 2) + (fila 3)
a31 = - (2.5 / 3.5) * (0) + (0) = 0
a32 = - (2.5 / 3.5) * (3.5) + (2.5) = 0
a33 = - (2.5 / 3.5) * (0.25) + (- 0.75) = - 0.9285714286

[U] =

-2

-1

3.5

0.25

- 0.9285714286

Encontrando [L]

[L] =

1.25

0.25 0.7142857143

Ahora ya se tiene la matriz [U] y la matriz [L]. El siguiente paso es resolver


Ly = b para encontrar la matriz y. En pocas palabras es como que se pidiera
resolver el siguiente sistema de ecuaciones, encontrando los valores de y1, y2 y
y3:

Al resolver el sistema anterior, se obtienen los siguientes valores para y1, y2 y y3:

El ltimo paso es resolver Ux = y para encontrar la matriz x. En otras palabras es


como que se pidiera resolver el siguiente sistema de ecuaciones, encontrando los
valores de x1, x2 y x3:

La solucin del sistema es:

Este es finalmente el valor de x1, x2 y x3; es decir, la respuesta del ejercicio


utilizando la descomposicin LU.

Ejemplo
Calcular la inversa de la siguiente matriz:

A=

-9

-4

-1

Encontramos la matrices triangular inferior [L] y la matriz triangular superior [U]:

[U]=

[L]=

-9

0.5

-10

d1

0.5

d2

0.25 2.5 2

d3

[L]=

0.5

0.25 2.5 2

0
0

d1= 1
0.5d1 + d2= 0

d2= -0.5 (1)= -0.5

0.25d1 + 2.5d2 + 3= 0

d3= -0.25 (1) - 2.5 (-0.5)=1

En donde por sustitucin hacia delante se obtiene:


1

dt=

-0.5
1

Este vector se utiliza como lado derecho de la ecuacin:

[U]=

-9

x1

0.5

x2

-10

1
=

-0.5

x3

Por sustitucin hacia atrs se obtiene:


4x1-9x2+2x3= 1

x1= (1+0.2+0)/4=0.3

0.5x2+5x3= -0.5

x2= (-0.5+0.5)/0.5=0

-10x3=1

x3= -1/10

Que es la primera columna de la matriz inversa:

A-1 =

[L]=

0.3

-0.1

d1

0.5

d2

0.25 2.5 2

d3

0
=

1
0

d1= 0
0.5d1 + d2= 1

d2= 1+0 = 1

0.25d1 + 2.5d2 + 3= 0

d3= 0.25(0) - 2.5(1) = -2.5

dt=

1
-2.5

Tomando como ejemplo los pasos anteriores ya realizados se determina que:

[U]=

-9

x1

0.5

x2

-10

x3

1
-2.5

4x1-9x2+2x3= 0

x1= (0-0.5-4.5)/4 = -1.25

0.5x2+5x3= 1

x2= (-0.5+0.5)/0.5 = -0.5

-10x3= -2.5

x3= -2.5/-10 = 0.25

Que es la segunda columna de la matriz inversa

-1.25

xt=

-0.5
-0.25

A-1 =

0.3

-1.25

-0.5

-0.1

0.25

Ahora se procede igual que en los pasos anteriores lo nico es que va a cambiar
el vector siguiente:

d1

0.5

d2

0.25 2.5 2

d3

[L]=

d1= 0
0.5d1 + d2= 0

d2= 0+0 = 0

0.25d1 + 2.5d2 + 3= 1

d3= 1 +0 +0 = 1

dt=

0
1

Tomando como ejemplo los pasos anteriores ya realizados se determina que:

[U]=

-9

x1

0.5

x2

-10

x3

Por sustitucin hacia atrs se obtiene

2.3

xt=

1
-0.1

Que esta es la tercera columna de la matriz inversa


Entonces al terminar todo esto se obtiene la matriz inversa:

A-1 =

0.3

-1.25

2.3

-0.5

-0.1

0.25

-0.1

//--------------------------------------------------------------------------#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
double A[3][3],B[3][3],U[3][3],L[3][3],T[3][3],LU[3][3],H[3][3],I[3][3];
double Z[3][3],X[3][3];
int V[3][3],i=1,j=1;

TForm1 *Form1;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button14Click(TObject *Sender)


{
Close();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
A[i][j]= Edit1->Text.ToDouble();
Edit1->Text= "";
if (i==1)
{
if(j==1) Edit2->Text= A[1][1];
if(j==2) Edit3->Text= A[1][2];
if(j==3) Edit4->Text= A[1][3];
}

if (i==2)
{
if(j==1) Edit5->Text= A[2][1];
if(j==2) Edit6->Text= A[2][2];
if(j==3) Edit7->Text= A[2][3];
}
if (i==3)
{
if(j==1) Edit8->Text= A[3][1];
if(j==2) Edit9->Text= A[3][2];
if(j==3) Edit10->Text= A[3][3];
}
j++;
if (j==4)
{
i++;
j=1;
}

Edit1->SetFocus();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)


{
T [1][1]=A[1][1];
T [1][2]=A[1][2];
T [1][3]=A[1][3];
for (int i=2;i<=2;i++)
{
for (int j=1;j<=3;j++)
{
T [2][j]=A[2][j]-((A[2][1]/A[1][1]*(A[1][j])));
}
}
for (int i=3;i<=3;i++)
{
for (int j=1;j<=3;j++)
{
T [3][j]=A[3][j]-((A[3][1]/A[1][1]*(A[1][j])));
}
}
for (int i=3;i<=3;i++)
{
for (int j=1;j<=3;j++)
{

U[3][j]=T[3][j]-((T[3][2]/T[2][2]*(T[2][j])));
}
}
U[1][1]=T[1][1];
U[1][2]=T[1][2];
U[1][3]=T[1][3];
U[2][1]=T[2][1];
U[2][2]=T[2][2];
U[2][3]=T[2][3];

Edit11->Text=AnsiString(U[1][1]);
Edit11->Text=AnsiString(U[1][1]);
Edit12->Text=AnsiString(U[1][2]);
Edit13->Text=AnsiString(U[1][3]);
Edit14->Text=AnsiString(U[2][1]);
Edit15->Text=AnsiString(U[2][2]);
Edit16->Text=AnsiString(U[2][3]);
Edit17->Text=AnsiString(U[3][1]);
Edit18->Text=AnsiString(U[3][2]);
Edit19->Text=AnsiString(U[3][3]);
Edit1->SetFocus();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button3Click(TObject *Sender)


{
L[1][1]=1;
L[1][2]=0;
L[1][3]=0;
L[2][1]= A[2][1]/A[1][1];
L[2][2]=1;
L[2][3]=0;
L[3][1]= A[3][1]/A[1][1];
L[3][2]= T[3][2]/T[2][2];
L[3][3]=1;
Edit20->Text=AnsiString(L[1][1]);
Edit21->Text=AnsiString(L[1][2]);
Edit22->Text=AnsiString(L[1][3]);
Edit23->Text=AnsiString(L[2][1]);
Edit24->Text=AnsiString(L[2][2]);
Edit25->Text=AnsiString(L[2][3]);
Edit26->Text=AnsiString(L[3][1]);
Edit27->Text=AnsiString(L[3][2]);
Edit28->Text=AnsiString(L[3][3]);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)


{
LU[1][1]=((L[1][1]*U[1][1])+(L[1][2]*U[2][1])+(L[1][3]*U[3][1]));
LU[1][2]=((L[1][1]*U[1][2])+(L[1][2]*U[2][2])+(L[1][3]*U[3][2]));
LU[1][3]=((L[1][1]*U[1][3])+(L[1][2]*U[2][3])+(L[1][3]*U[3][3]));
LU[2][1]=((L[2][1]*U[1][1])+(L[2][2]*U[2][1])+(L[2][3]*U[3][1]));
LU[2][2]=((L[2][1]*U[1][2])+(L[2][2]*U[2][2])+(L[2][3]*U[3][2]));
LU[2][3]=((L[2][1]*U[1][3])+(L[2][2]*U[2][3])+(L[2][3]*U[3][3]));
LU[3][1]=((L[3][1]*U[1][1])+(L[3][2]*U[2][1])+(L[3][3]*U[3][1]));
LU[3][2]=((L[3][1]*U[1][2])+(L[3][2]*U[2][2])+(L[3][3]*U[3][2]));
LU[3][3]=((L[3][1]*U[1][3])+(L[3][2]*U[2][3])+(L[3][3]*U[3][3]));

Edit29->Text=AnsiString(LU[1][1]);
Edit30->Text=AnsiString(LU[1][2]);
Edit31->Text=AnsiString(LU[1][3]);
Edit32->Text=AnsiString(LU[2][1]);
Edit33->Text=AnsiString(LU[2][2]);
Edit34->Text=AnsiString(LU[2][3]);
Edit35->Text=AnsiString(LU[3][1]);
Edit36->Text=AnsiString(LU[3][2]);
Edit37->Text=AnsiString(LU[3][3]);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)


{
Z[1][1]=1;
Z[2][1]=(-1*L[2][1]* L[1][1]+ L[2][3]);
Z[3][1]=((-1*L[3][2]* Z[2][1])+(-1* L[3][1]));
Edit38->Text=AnsiString(Z[1][1]);
Edit39->Text=AnsiString(Z[2][1]);
Edit40->Text=AnsiString(Z[3][1]);

}
//--------------------------------------------------------------------------void __fastcall TForm1::Button6Click(TObject *Sender)
{
Z[1][2]=0;
Z[2][2]=1;
Z[3][2]=1*(-L[3][2]);
Edit41->Text=AnsiString(Z[1][2]);
Edit42->Text=AnsiString(Z[2][2]);
Edit43->Text=AnsiString(Z[3][2]);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button7Click(TObject *Sender)


{
Z[1][3]=0;
Z[2][3]=0;
Z[3][3]=1*L[3][3];
Edit44->Text=AnsiString(Z[1][3]);
Edit45->Text=AnsiString(Z[2][3]);
Edit46->Text=AnsiString(Z[3][3]);

}
//--------------------------------------------------------------------------void __fastcall TForm1::Button8Click(TObject *Sender)
{
X[3][1]=Z[3][1]/U[3][3];
X[2][1]=(Z[2][1]-U[2][3]*X[3][1])/U[2][2];
X[1][1]=(Z[1][1]-(U[1][3]*X[3][1])-(U[1][2]*X[2][1]))/U[1][1];
Edit49->Text=AnsiString(X[3][1]);
Edit48->Text=AnsiString(X[2][1]);
Edit47->Text=AnsiString(X[1][1]);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button9Click(TObject *Sender)


{

X[3][2]= Z[3][2]/U[3][3];
X[2][2]= (Z[2][2]-(U[2][3]*X[3][2]))/U[2][2];
X[1][2]= (Z[1][2]-(U[1][3]*X[3][2])-(U[1][2]*X[2][2]))/U[1][1];
Edit52->Text=AnsiString(X[3][2]);
Edit51->Text=AnsiString(X[2][2]);
Edit50->Text=AnsiString(X[1][2]);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button10Click(TObject *Sender)
{

X[3][3]= Z[3][3]/U[3][3];
X[2][3]= (Z[2][3]-(U[2][3]*X[3][3]))/U[2][2];
X[1][3]= (Z[1][3]-(U[1][3]*X[3][3])- (U[1][2]*X[2][3]))/U[1][1];
Edit55->Text=AnsiString(X[3][3]);
Edit54->Text=AnsiString(X[2][3]);
Edit53->Text=AnsiString(X[1][3]);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button11Click(TObject *Sender)


{
I[1][1]=X[1][1];
I[1][2]=X[1][2];
I[1][3]=X[1][3];
I[2][1]=X[2][1];
I[2][2]=X[2][2];
I[2][3]=X[2][3];
I[3][1]=X[3][1];
I[3][2]=X[3][2];
I[3][3]=X[3][3];
Edit56->Text=AnsiString(X[1][1]);
Edit57->Text=AnsiString(X[1][2]);
Edit58->Text=AnsiString(X[1][3]);
Edit59->Text=AnsiString(X[2][1]);
Edit60->Text=AnsiString(X[2][2]);
Edit61->Text=AnsiString(X[2][3]);
Edit62->Text=AnsiString(X[3][1]);
Edit63->Text=AnsiString(X[3][2]);
Edit64->Text=AnsiString(X[3][3]);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button12Click(TObject *Sender)


{
V[1][1]=((A[1][1]*I[1][1])+(A[1][2]*I[2][1])+(A[1][3]*I[3][1]))+0.5;
V[1][2]=((A[1][1]*I[1][2])+(A[1][2]*I[2][2])+(A[1][3]*I[3][2]));
V[1][3]=((A[1][1]*I[1][3])+(A[1][2]*I[2][3])+(A[1][3]*I[3][3]));
V[2][1]=((A[2][1]*I[1][1])+(A[2][2]*I[2][1])+(A[2][3]*I[3][1]));
V[2][2]=((A[2][1]*I[1][2])+(A[2][2]*I[2][2])+(A[2][3]*I[3][2]))+0.5;
V[2][3]=((A[2][1]*I[1][3])+(A[2][2]*I[2][3])+(A[2][3]*I[3][3]));
V[3][1]=((A[3][1]*I[1][1])+(A[3][2]*I[2][1])+(A[3][3]*I[3][1]));
V[3][2]=((A[3][1]*I[1][2])+(A[3][2]*I[2][2])+(A[3][3]*I[3][2]));
V[3][3]=((A[3][1]*I[1][3])+(A[3][2]*I[2][3])+(A[3][3]*I[3][3]))+0.5;
Edit65->Text=AnsiString(V[1][1]);
Edit66->Text=AnsiString(V[1][2]);
Edit67->Text=AnsiString(V[1][3]);
Edit68->Text=AnsiString(V[2][1]);
Edit69->Text=AnsiString(V[2][2]);
Edit70->Text=AnsiString(V[2][3]);
Edit71->Text=AnsiString(V[3][1]);
Edit72->Text=AnsiString(V[3][2]);
Edit73->Text=AnsiString(V[3][3]);

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button13Click(TObject *Sender)


{
Edit1->Text= "";
Edit2->Text= "";
Edit3->Text= "";
Edit4->Text= "";
Edit5->Text= "";
Edit6->Text= "";
Edit7->Text= "";
Edit8->Text= "";
Edit9->Text= "";
Edit10->Text= "";
Edit11->Text= "";
Edit12->Text= "";
Edit13->Text= "";
Edit14->Text= "";
Edit15->Text= "";
Edit16->Text= "";
Edit17->Text= "";
Edit18->Text= "";
Edit19->Text= "";
Edit20->Text= "";
Edit21->Text= "";
Edit22->Text= "";
Edit23->Text= "";
Edit24->Text= "";
Edit25->Text= "";
Edit26->Text= "";
Edit27->Text= "";
Edit28->Text= "";

Edit29->Text= "";
Edit30->Text= "";
Edit31->Text= "";
Edit32->Text= "";
Edit33->Text= "";
Edit34->Text= "";
Edit35->Text= "";
Edit36->Text= "";
Edit37->Text= "";
Edit38->Text= "";
Edit39->Text= "";
Edit40->Text= "";
Edit41->Text= "";
Edit42->Text= "";
Edit43->Text= "";
Edit44->Text= "";
Edit45->Text= "";
Edit46->Text= "";
Edit47->Text= "";
Edit48->Text= "";
Edit49->Text= "";
Edit50->Text= "";
Edit51->Text= "";
Edit52->Text= "";
Edit53->Text= "";
Edit54->Text= "";
Edit55->Text= "";
Edit56->Text= "";
Edit57->Text= "";
Edit58->Text= "";

Edit59->Text= "";
Edit60->Text= "";
Edit61->Text= "";
Edit62->Text= "";
Edit63->Text= "";
Edit64->Text= "";
Edit65->Text= "";
Edit66->Text= "";
Edit67->Text= "";
Edit68->Text= "";
Edit69->Text= "";
Edit70->Text= "";
Edit71->Text= "";
Edit72->Text= "";
Edit73->Text= "";
Edit73->SetFocus();
i=1;
j=1;
}
//---------------------------------------------------------------------------

Вам также может понравиться