Está en la página 1de 8

Método de LU & Cholesky

OBJETIVO:

El objetivo del método es encontrar una solución a un sistema de ecuaciones


lineales, basado en la factorización LU de la matriz de coeficientes relacionada al
sistema.

INTRODUCCIÓN:

En matemáticas, la factorización o descomposición de Cholesky toma su nombre


del matemático André-Louis Cholesky, quien encontró que una matriz simétrica
definida positiva puede ser descompuesta como el producto de una matriz
triangular inferior y la traspuesta de la matriz triangular inferior. La matriz triangular
inferior es el triángulo de Cholesky de la matriz original positiva definida. El
resultado de Cholesky ha sido extendido a matrices con entradas complejas. Es
una manera de resolver sistemas de ecuaciones matriciales y se deriva de la
factorización LU con una pequeña variación.

Sin embargo, se pueden escoger los factores tales que U es la transpuesta de L, y


esto se llama la descomposición o factorización de Cholesky. Tanto la
descomposición LU como la descomposición de Cholesky son usadas para
resolver sistemas de ecuaciones lineales. Cuando es aplicable, la descomposición
de Cholesky es dos veces más eficiente que la descomposición LU.

También en el álgebra lineal, la factorización o descomposición LU (del inglés


Lower-Upper) es una forma de factorización de una matriz como el producto de
una matriz triangular inferior y una superior. Debido a la inestabilidad de este
método, deben tenerse en cuenta algunos casos especiales, por ejemplo, si uno o
varios elementos de la diagonal principal de la matriz a factorizar es cero, es
necesario pre multiplicar la matriz por una o varias matrices elementales de
permutación. Método llamado factorización PA = LU o LU con pivote. Esta
descomposición se usa en el análisis numérico para resolver sistemas de
ecuaciones (más eficientemente) o encontrar las matrices inversas.
MARCO TEÓRICO:

A fin de poder entender la factorización de Cholesky es necesario tener una leve


visión histórica de todo el conjunto de acontecimientos que desembocaron en el
desarrollo de este algoritmo. Todo empezó con los Sistemas de Ecuaciones
Lineales, también conocidos como SEL. Un sistema de ecuaciones lineales es un
conjunto de m ecuaciones con n incógnitas, cuya solución es un conjunto de
valores para las incógnitas con el que se satisfacen todas las ecuaciones. Tal y
como se cita en [9] estos sistemas aparecen en el planteamiento matemático de
muchos problemas científicos.

Para este método de factorización directa de matrices, se utiliza como fundamento


que los valores de la diagonal de la matriz U son iguales a los de la matriz L, ósea
U kk =Lkk .

El procedimiento a seguir para la aplicación del método es el siguiente:

Se debe construir una matriz de coeficientes y el vector con los términos


independientes, correspondientes al sistema, y se toman como valores iniciales
para poder calcular la factorización.

Tomando la matriz de coeficientes, y bajo el fundamento principal del método, se


procese al cálculo de las matrices L y U, correspondientes a la factorización de A.

Una vez realizada la factorización, se toma la matriz de la factorización U y el


vector x y se procede a calcular el vector z.

Ahora con el vector z, el vector de términos independientes y la matriz L de la


factorización, se procede a resolver el sistema L z=b
Análogamente a la factorización LU, para resolver un SEL mediante la
Factorización de Cholesky, no hay más que resolver mediante la substitución
hacia delante (Lz ¿ b), y substitución hacia atrás ( LTx=z .). Una de las formas más
sencillas de implementar el código de la factorización de Cholesky es de la
siguiente manera (implementación en pseudocódigo teniendo en cuenta que A es
la matriz asociada y n la dimensión de dicha matriz):

ALGORITMO

Cholesky(MATRIZ A,entero N)

desde i = 0 hasta n

desde j = 0 hasta i-1

suma = 0.0;

desde k = 0 hasta j – 1

suma += A[i][k] * A[j][k];

A[i][j] = (A[i][j] - suma) / A[j][j];

suma = 0.0;

desde k = 0 hasta i – 1

suma += A[i][k] * A[i][k];

A[i][i] = raiz2(A[i][i] - suma);

}
Observando el pseudocódigo es relativamente sencillo calcular el coste
computacional de la factorización de Cholesky. Dado que A es una matriz de
orden n, teniendo en cuenta que los métodos de substitución hacia delante y hacia
atrás son de coste n2 .

RESOLUCIÓN DE UN PROBLEMA CON MÉTODO DE CHOLESKY:

 Sea el siguiente sistema de ecuaciones lineales

A=¿ C=¿

Solución:

 Encontrar la matriz L usando las fórmulas

i−1
a ki−∑ l ij l kj k−1
l ki= j=1
l ii √
l kk = akk − ∑ l 2kj
j=1

Entonces.

a21 15
l 11= √ a11= √6= 2.4495 l 21= = =6.1237
l 11 2.4495
a31 55
l 31= = =¿= 22.454 con l12 = 0
l 11 2.4495

l 22=√ a22−l =√ 55−6.1237 2 = 4.1833


2
21

a32−l 21 l 31 55−(6.1237)(22.454)
l 32= = = 20.916
l 22 4.1833

De igual forma l 13=l 23=0 y

l 33= a33−(l ¿¿ 31 +l )=√ 979−(22.454 2+20.1916 2)¿= 6.1106


√ 2 2
32
Matriz L es igual a

2.4495 0 0 

L  6.1237 4.1833 0 
22.454 20.916 6.1106 

En el método de Cholesky U =LT

2.4495 6.1237 22.454


U= 0
0 [ 4.1833 20.916
0 6.1106 ]
 Después se prosigue a encontrar el vector D de la misma manera que en el método
de descomposición de LU
i−1
c i −∑ lij d j
j =1
d i=
l ii

C1 100 C 3−l 21 d 1 150−( 6.1237)(40.8246)


l 21= = = 40.8246 d 2= = = -23.9045
l 11 2.4495 l 22 4.1833

c 3−(l 31 d 1 +l 32 d 2 )
d 3= =100−¿ ¿ = -51.826
l 33

 Se calcula el vector de incógnitas comenzando por la última x.


n
d i− ∑ uij x j
j=i+1
x i=
uii

d3 d 2−u23 x 2
x 3= =¿-8.481 x 2= =36.690
u33 u33

(u ¿ ¿ 21 x 2+ u13 x 3)
x 1=d 1− ¿= 2.685
u 11
El resultado se puede comprobar multiplicando A por X y el resultado debe ser igual a C.

PROGRAMAS EN C++

#include 
#include "Leer.h"
#include 

double** LeerDatos(char *nombrefichero,int *dimension) {


double **matriz;
int i,j;
FILE *f;

if(f=fopen(nombrefichero,"r"),!f){
printf("Problema con la lectura del fichero\n");
return matriz;
}
fscanf(f,"%d\n",&(*dimension));

/* Asignacion de memoria dinamica*/


matriz=(double**)malloc(*dimension*sizeof(double*));
for(i=0;i<*dimension;i++)
matriz[i]=(double*)malloc((*dimension+1)*sizeof(double));

for(i=0;i<*dimension;i++)
for(j=0;j<*dimension;j++)
fscanf(f,"%lf\n",&(matriz[i][j]));

for(i=0;i<*dimension;i++)
fscanf(f,"%lf\n",&(matriz[i][*dimension]));

fclose(f);
return matriz;
}
MÉTODO DE LU EN C++

#include<iostream>
#include<stdio.h>
#include<conio.h>

using namespace std;

int main()
{
int n,m,i,j,k;
float a[35][36],b[35][36];
do
{
system("cls");
cout<<"\n METODO DE DESCOMPOSICION LU"<<endl;
cout<<"\n Ingrese el número de Ecuaciones = ";
cin>>n;
cout<<"\n Ingrese coeficientes\n";
/* Datos para iniciar método */
for(i=1;i<=n;i++)
{
cout<<"\nFila"<<i<<endl;
for(j=1;j<=n+1;j++)
{
cout<<"Ingrese a("<<i<<","<<j<<") = ";
cin>>a[i][j];
}
}
// Fin Del Ciclo De Solicitud De Datos
//Proceso Principal
m=n+1;
do
{
if(a[1][1]==0)
{
k=m-1;
for(i=2;i<=k;i++)
{
if(a[i][1]!=0)
{
for(j=1;j<=m;j++)
{
apoyo=a[i][j];
a[i][j]=a[1][j];
a[1][j]=apoyo;
}
}
}
}
else
{
for(j=2;j<=m;j++)
{
for(i=2;i<=n;i++)
{
b[i-1][j-1]=a[i][j]-a[1][j]*a[i][1]/a[1][1];
}
}
for(j=2;j<=m;j++)
{
b[n][j-1]=a[1][j]/a[1][1];
}
m=m-1;
for(j=1;j<=m;j++)
{
for(i=1;i<=n;i++)
{
a[i][j]=b[i][j];
}
}
}
}
while(m>1);
cout<<"\n\n SOLUCION DEL SISTEMA"<<endl;
for(i=1;i<=n;i++)
{
cout<<"\nX("<<i<<") = "<<a[i][1];
}
cout<<"\n\n Fin del programa";
getch();
}
while(1);
}

También podría gustarte