Sei sulla pagina 1di 2

ETSII-UPM

Factorización directa de Crout ETSII-UPM

 Para una matriz cuadrada de rango r=n la eliminación de Gauss llega


al siguiente resultado:
a11 a12 a13 a14   1 0 0 0  u11 u12 u13 u14 
a a a a  l 1 0 00 u u u 
24 
A  LU;  21 22 23 24
   21  22 23

Factorización Directa de Matrices a

31
a
32
a
33
a  l
34
 
31
l
32
1 0  0

0 u 33 u 34 

 a4 1 a42 a 43 a4 4  l 41 l 4 2 l 43 1  0 0 0 u 44 
Métodos de Crout y Choleski  A este mismo resultado se puede llegar por identificación directa
 A partir de la primera fila de A
Matemáticas de la Especialidad (Mecánica-Máquinas) u1 j  a1 j j  1,2,..., n

Madrid, 21 de octubre de 2002  A partir de la primera columna de A


a j1  l j1 u11; l j1 =a j1 / u11 j  2,3,...n

Javier García de Jalón  A partir de la segunda fila de A


u1 u2 1j
ETSII - Departamento de Matemática Aplicada a 2 j  l 21u1 j  1 u2 j; u2 j 2j 21a1j 2 
j
l u a  j  2,...,n
a la Ingeniería Industrial u 11
 A partir de la segunda columna de A
alulu;l
j2 j1 1 2 j2 2 2
1
a  l u  j  3,..., n
j2 j2j11 2
u 22

Factorización directa de Crout (2) Factorización directa de Crout (3) ETSII-UPM


ETSII-UPM
 Fórmulas generales para la factorización de Crout: A= LU
a11 a12 a13 a14   1 0 0 0  u11 u12 u13 u14 
a a a a  l 1 0 00 u u u 
24 
A  LU;  21 22 23 24
   21  22 23

a a a a  l l 1 0  0 0 u 33 u 34 
    
31 32 33 34 31 32

 a41 a42 a 43 a44  l 41 l 4 2 l 4 3 1  0 0 0 u 44  =

 Para la tercera fila y columna de A


 Elemento de la diagonal  Las zonas rayadas en L y U son las zonas ya calculadas
a33  l31 u13  l32 u23  1 u33 u33  a 33  l31 u13  l32 u23  A partir de aii se calcula el elemento de la diagonal uii
i 1 i1
 Resto de los elementos de la 3ª fila a ii   li k uk i  ui i uii  ai i   lik u ki
a 34  l31 u14  l3 2u 2 4  u3 4 u3 4  a3 4  l 3 1u1 4  l 32 u2 4 k 1 k 1

 Elementos de la 3ª columna  A partir de aij (j=i+1, …, n) se calculan los elementos de la fila i de U


i 1 i 1
1
a l u l u l u l  a  l u  l u  a ij   li k uk j  u ij ui j  a ij   li k uk j j  i  1,..., n
43 4113 4223 43 33 43 43 4 1 1 3 4 2 2 3
u 33 k 1 k 1

 Para el último elemento de la diagonal  A partir de aji (j=i+1, …, n) se calculan los elementos de la columna i de L
i 1
1 i 1

a44  l4 1u1 4  l42 u2 4  l43 u3 4  1 u44 u4 4  a 4 4  l41 u14  l42 u2 4 l43 u34 a ji   l jk u ki  l ji ui i lji  a ji   l j k uk i  j  i 1,..., n
k 1 uii  k 1 

Crout para matrices simétricas ETSII-UPM


Crout para matrices simétricas (2) ETSII-UPM

 Si la matriz A es simétrica las expresiones de lij y de uji coinciden,  Cálculo por filas
excepto en que los elementos lij están divididos por los uii  La parte rayada está ya calculada
 Se puede escribir entonces A  LU  LDLT  El cálculo de los elementos de la fila i recuerda al producto escalar de la
columna i por la columna j, excepto que cada sumando está dividido por el
 Hay dos posibilidades para almacenar el resultado: elemento de la diagonal. Estas divisiones restan eficiencia a los cálculos
 Almacenar U en su posición habitual incluyendo su diagonal, lo que permite i1 i 1 i1
uki2
d ii  aii   li k uki  aii  u
uk i
recuperar L fácilmente
i j uki aii  u
k 1 k 1 kk k 1
 Almacenar D en la diagonal de la matriz resultado y LT en la mitad superior. kk

En este caso, las filas de U se guardan ya divididas por el elemento de la i1 i1
ukiukj
diagonal uij  aij   l ik ukj  aij  
k 1 k 1
u kk
 Los cálculos pueden hacerse por filas y por columnas. En las j  i 1,...,n
siguientes transparencias se desarrollará con detalle el caso de filas l ij  (ai j  
i 1
l ik u k j ) / di i  ( aij  l l d
i 1
kikj kk ) / di i
T T T

k 1 k 1

j  i  1,...,n

 El algoritmo puede modificarse para resolver esta dificultad,


al mismo tiempo que se vectoriza.
Algoritmo de Crout ETSII-UPM
Algoritmo de Crout Vectorizado ETSII-UPM

 El algoritmo de Crout, almacenando D y LT, puede ser como se  El resultado contendrá la matriz D y la matriz LT
muestra a continuación: i j  En los estados intermedios (antes de operar sobre la fila i):
% primera fila de L'  Parte de los elementos son LT (ya definitivos, rayado a 45º) y
for j=2:n
A(1,j)=A(1,j)/A(1,1);  Parte son A (los no modificados todavía, rayado discontinuo)
end
for i=2:n  El paso i realiza las siguientes tareas:
% se forma el vector auxiliar  Calcula un vector auxiliar v (columna i i j
for k=1:i- 1;
v(k)=A(k,i)*A(k,k); de LT multiplicada por diagonal)
end  Calcula el valor definitivo de dii
% cálculo del elemento diagonal
for k=1:i- 1 i1 i 1 i 1
 Pasa de A a LT la fila i
A(i,i)=A(i,i)-v(k)*A(k,i);
d ii  aii   lik uki  aii  l l
T T T

end l dii aii 


k iki ki vk  Expresiones
% cálculo del resto de la fila i k 1 k 1 k 1
for j=i+1:n i1 v  lT d j  1,2,...,i -1
l ij  (aij   lik uk j )/ d ii 
T j ji jj

 l v l
for k=1:i-1 i1 i1 i1
A(i,j)=A(i,j)- v(k)*A(k,j); k 1 ii ii ik ki ii kTi kT i kk ii kkiT
end d a  l u a  l d a 
 (aij   l kiTvk ) / d ii
i1
A(i,j)=A(i,j)/A(i,i); j  i  1,...,n k1 k1 k 1
end i1 i 1 i1
end
k 1
l T  (a   lT u ) / d  (a   lT l T d ) / d (a   v lT ) / d j  i  1,...,n
ij ij ki kj ii ij kik j kk ii ij kk j ii
k1 k1 k 1

Algoritmo de Crout Vectorizado (2) ETSII-UPM


Algoritmo de Crout Vectorizado (3) ETSII-UPM

 El programa de factorización puede ser como sigue (dos bucles for):  El siguiente programa de Matlab calcula la factorización de Crout
i j utilizando doble vectorización (un solo bucle for)
% se guardan D y L' (A=L*D*L')
v=zeros(n,1);
% se guardan D y L' (A=L*D*L')
d=zeros(n,1); d(1)=A(1,1);
% se divide la fila 1 por A(1,1) v=zeros(n,1);
d=zeros(n,1); d(1)=A(1,1);
A(1,2:n)=A(1,2:n)/A(1,1);
% primera fila de L'
for i=2:n
% vector auxiliar A(1,2:n)=A(1,2:n)/A(1,1);
% restantes filas
v(1:i-1)=A(1:i- 1,i).*d(1:i -1);
for i=2:n
% elemento diagonal fila i
dii=A(i,i); % vector auxiliar: columna i dividida diagonal
v(1:i-1)=A(1:i- 1,i).*d(1:i -1);
dii=dii-v(1:i-1)'*A(1:i-1,i);
% elemento de la diagonal
d(i)=dii;
A(i,i)=dii; dii=A(i,i);
dii=dii-v(1:i-1)'*A(1:i-1,i);
% cálculo del resto de la fila i
A(i,i)=dii;
for j=i+1:n
A(i,j)=(A(i,j)-v(1:i-1)'*A(1:i-1,j))/dii; d(i)=dii;
% resto de la fila i
end
A(i,i+1:n)=(A(i,i+1:n)-v(1:i-1)'*A(1:i-1,i+1:n))/dii;
end
end

Factorización de Choleski ETSII-UPM


Resultados numéricos con Matlab ETSII-UPM

 Se aplica a matrices simétricas y definidas-positivas, pues hace falta  A continuación se dan algunos resultados de tiempos con Matlab
que esté garantizado el que todos los pivots sean positivos (Pentium III, 800 Mhz )

A=LU   GaussElimSim1 (n=400) 124.78 s (sin vectorizar)


 LDLT  0  GaussElimSim2 (n=400) 7.12 s (vectorización simple)
=
 LD1/ 2D1/2LT   GaussElimSim3 (n=400) 7.62 s (vectorización doble)
0  CroutMod1 (n=400) 136.88 s (sin vectorizar)
 LLT
 CroutMod2 (n=400) 5.287 s (vectorización simple)
 CroutMod3 (n=400) 1.042 s (vectorización doble)
 Expresiones (se va a trabajar con L y con la parte inferior de A):  Con la función lu() de Matlab: 0.821 s
 Elemento de la diagonal 1

 
i i1 i1 2
ik k i ik ii ii  ii ik   Comparación entre Crout y la eliminación de Gauss
k 1 k 1  k 1 
 Elementos de la columna i  La factorización de Crout conduce al mismo resultado que la eliminación de

l ji  1  a ji   l jk li k 
Gauss y realiza el mismo nº de operaciones aritméticas, pero es más eficiente
 l jk li k  lj ili i
i i1 i1

ki
l ii  en el manejo de los accesos de la CPU a la memoria del ordenador, pues cada
k 1 k 1 k 1 
elemento de A sufre en un solo paso todas las transformaciones