libreria para operaciones de matrices … · libreria para operaciones de matrices utilizando...
TRANSCRIPT
LIBRERIA PARA OPERACIONES DE MATRICES UTILIZANDO PROCESAMIENTO EN PARALELO
BENIGNO LOZANO ROJAS FRANCISCO FORERO GARCíA
DIRECTOR: Dr. MATEO LEZCANO BRITTO
FUNDACIÓN UNIVERSITARIA KONRAD LORENZ Facultad de Ingeniería de Sistemas
Especialización en Informática y Ciencias de la Computación Bogotá, 2006
LIBRERIA PARA OPERACIONES DE MATRICES UTILIZANDO PROCESAMIENTO EN PARALELO
BENIGNO LOZANO ROJAS FRANCISCO FORERO GARCíA
DIRECTOR: Dr. MATEO LEZCANO BRITTO
Trabajo presentado como requisito parcial para optar al título de “Especialista en Informática y Ciencias de la Computación”.
FUNDACIÓN UNIVERSITARIA KONRAD LORENZ Facultad de Ingeniería de Sistemas
Especialización en Informática y Ciencias de la Computación Bogotá, 2006
TABLA DE CONTENIDO
1. INTRODUCCIÓN 1
2. ESTADO DEL ARTE DE LA PROGRAMACIÓN EN PARALELO 3
2.1 COMPUTADORES PARALELOS Y COMPUTACIÓN PARALELA 3
3. CONCEPTUALIZACIÓN REQUERIDA 7
3.1 OPERACIONES CON MATRICES 7
3.1.1 Notación matricial 7
3.1.2 Operaciones con matrices 8
3.1.3 Notación de vectores 9
3.1.4 Operaciones con vectores 9
3.1.5 Particionando una matriz en filas y columnas 11
3.1.6 La notación coma 12
3.1.7 Multiplicación matriz por matriz 12
3.1.8 Especificaciones de nivel escalar 13
3.1.9 Formulación de un producto punto 16
3.1.10 Una formulación Saxpy 18
3.1.11 Una formulación de producto externo 19
3.1.12 Una nota sobre ecuaciones de matrices 21
3.1.13 Matriz inversa 22
3.1.14 El determinante 24
3.2 SISTEMAS DE ECUACIONES LINEALES 25
3.2.1 No singularidad y unicidad de soluciones 25
3.3 SISTEMAS TRIANGULARIZADOS 29
3.3.1 Sistemas Triangulares 29
3.3.2 Sistemas triangulares inferiores 30
3.3.3 Sustitución forward orientada por columnas 34
3.3.4 Sistemas triangulares superiores 37
3.3.5 Algoritmos para bloqueo de matrices 38
3.4 MÉTODOS DE DESCOMPOSICIÓN 39
3.4.1 Descomposición LU 39
4. LA LIBRERÍA PROPUESTA 49
5. CONCLUSIONES 50
6. BIBLIOGRAFÍA 52
6.1 WEBGRAFÍA 53
1. INTRODUCCIÓN
Las operaciones con matrices necesitan un considerable tiempo de cálculo
ya que, normalmente, se realizan sobre una cantidad grande de datos. Una
vía para solucionar esa problemática es convertir el procesamiento
secuencial en paralelo, forma de trabajo que es posible porque los datos
cumplen las condiciones de Berstein.
Operaciones como la suma, el producto por escalar y aún el cálculo de la
matriz transpuesta, son sencillas y al llevarlas a procesamiento paralelo
ahorran tiempo, sin embargo otras operaciones como el producto, cálculo del
determinante y cálculo de la matriz inversa, requieren el diseño de algoritmos
complejos, que hagan eficiente su procesamiento en paralelo.
Es entonces el propósito fundamental de este trabajo, ofrecer una librería en
lenguaje C que contenga las operaciones mencionadas con matrices de gran
tamaño, entendidas como aquellas con dimensiones superiores a 100 filas y
100 columnas.
2
El documento está dividido en seis partes; ésta –la introducción-; el capítulo
dos, que contiene el estado del arte de la programación en paralelo; el
capítulo 3, que hace referencia a los principales conceptos relacionados con
matrices y sus operaciones; el capítulo 4, que contiene la documentación de
la librería propuesta; el capítulo 5 contiene las conclusiones del trabajo
realizado y el capítulo 6 la bibliografía utilizada.
El anexo 1, presenta la programación en lenguaje C, de las ideas propuestas.
2. ESTADO DEL ARTE DE LA PROGRAMACIÓN EN PARALELO
2.1 COMPUTADORES PARALELOS Y COMPUTACIÓN PARALELA
La idea de la computación paralela se basa en tres consideraciones similares
aunque distintas. La primera, asociada con el desarrollo de computadores en
paralelo, es el deseo de ser capaces de resolver problemas que requieran
almacenamiento significativo de datos o soluciones secuenciales que tomen
mucho tiempo sobre un mainframe simple.
La segunda consideración está relacionada con el deseo de resolver
problemas en línea en tiempo real, cada vez más sofisticados. En este caso,
es necesario utilizar microprocesadores de bajo costo, capaces de soportar
algoritmos sofisticados en el control de sistemas, para mejorar el rendimiento
con más potencia computacional en sistemas en paralelo.
La tercera consideración está relacionada con la solución de problemas que
tienen efectivamente tareas paralelas, las cuales se adaptan por su
naturaleza al uso de esta metodología.
4
Flynn (1966) clasificó las diferentes organizaciones según el hardware
disponible para atender a los flujos de datos e instrucciones en:
• SISD, del inglés Simple Instruction Simple Data
• SIMD, del inglés Simple Instruction Multiple Data
• MISD, del inglés Multiple Instruction Simple Data
• MIMD, del inglés Multiple Instruction Multiple Data
En el modelo SISD, Las instrucciones se ejecutan secuencialmente, pero
pueden estar solapadas en las etapas de ejecución y puede tener más de
una unidad funcional bajo supervisión de una sola CPU. Esta es la forma de
organización de la mayoría de los computadores actuales.
En el modelo SIMD existen múltiples unidades de ejecución o Elementos de
Proceso (EP) supervisados por una única Unidad Central (UC). Todos los EP
reciben la misma instrucción remitida por la UC pero operan sobre diferentes
conjuntos de datos procedentes de flujos distintos. Esta organización
corresponde a procesadores matriciales.
En el modelo MISD existen n unidades de procesamiento. Cada una recibe
distintas instrucciones que operan sobre el mismo flujo de datos y sus
5
derivados. Los resultados (la salida) de un procesador pasan a ser la entrada
(los operandos) del siguiente procesador. Esta organización incluye
computadores vectoriales, computadores tolerantes a fallos (varias UP
procesan los mismos datos pero con diferentes programas. Los resultados
aparentemente redundantes son comparados para detectar fallos).
En el modelo MIMD se incluyen sistemas con más de un procesador capaces
de ejecutar varios programas simultáneamente: Multiprocesadores y
Multicomputadores
Así como se distinguen estas cuatro categorías, también es necesario
distinguir cuidadosamente el nivel de tareas que se emprenden en paralelo y
la granularidad (longitud computacional) de las mismas.
Otra consideración importante es la necesidad de transferir datos a y desde
los procesadores paralelos. Esto puede conducir a un conflicto en el acceso
de memoria que puede disminuir el rendimiento. Un problema similar es la
frecuente necesidad de sincronizar la aritmética que se ejecuta sobre los
procesadores, para asegurar que si el procesador A necesita usar un nuevo
valor de datos que están siendo calculados por el procesador B, entonces el
procesador A no hace cálculos antes de que el procesador B termine su
tarea. Esto se conoce con el problema de sincronización y puede conducir a
rendimientos muy ineficientes si el tema no se considera cuidadosamente en
6
el diseño del código. El problema de sincronización generalmente puede
resolverse sobre máquinas SIMD, pero es tan importante en máquinas MIMD
que se ha propuesto seriamente la posibilidad de usar algoritmos
asincrónicos (Baudet, 1978).
3. ÁLGEBRA DE MATRICES
3.1 OPERACIONES CON MATRICES
El cálculo de matrices es construido sobre una jerarquía de operaciones
algebraicas. Los productos internos involucran las operaciones escalares de
suma y multiplicación. La multiplicación vector - matriz se hace sobre
productos internos. La multiplicación matriz - matriz incluye una colección de
productos vector- matriz. Todas estas operaciones pueden ser descritas en
forma de algoritmos o en el lenguaje del álgebra lineal. Estos dos estilos de
expresiones se complementan.
3.1.1 Notación matricial. Sea R el conjunto de números reales. Denotamos
el espacio vectorial de todas las matrices reales mxn por Rmxn:
A ∈∈∈∈ Rmxn ⇔⇔⇔⇔ A = (aij) =
mnm
n
aa
aa
...
.........
...
1
111
aij ∈∈∈∈ R
8
Si se utiliza una letra mayúscula para denotar una matriz (Ej. A, B, C),
entonces la correspondiente letra minúscula con los subíndices i, j se refieren
al elemento genérico i, j (ej. aij, bij, cij). Los elementos de una matriz también
pueden representarse con la notación [A]ij y A(i,j).
3.1.2 Operaciones con matrices. Las operaciones básicas con matrices
incluyen transposición (Rmxn →→→→ Rnxm),
C = AT ⇒⇒⇒⇒ cij = aji,
Adición (Rmxn x Rmxn→→→→ Rmxn),
C = A + B ⇒⇒⇒⇒ cij = aij+ bij,
Multiplicación de un escalar por una matriz, (R x Rmxn→→→→ Rmxn),
C = ααααA ⇒⇒⇒⇒ cij = ααααaij ,
y la multiplicación de una matriz por otra ( Rmxp x Rpxn→→→→ Rmxn),
C = AB ⇒⇒⇒⇒ cij = ∑=
r
k
kjikba1
9
3.1.3 Notación de vectores. Sea Rn que denota el espacio n-vectorial real:
x ∈∈∈∈ Rn ⇔⇔⇔⇔ x =
nx
x
...
1
xi ∈∈∈∈ R
xi representa al i-ésimo componente de x. Dependiendo del contexto, las
notaciones alternativas [x]i y x(i) son usadas algunas veces.
Rn se representa como Rnx1; así los elementos de Rn son vectores columna.
De otra manera, los elementos de R1xn son vectores fila:
x ∈∈∈∈ R1xn ⇔⇔⇔⇔ x = (x1 , …, xn ).
Si x es un vector columna, entonces xT es un vector fila.
3.1.4 Operaciones con vectores. Dado a ∈∈∈∈ R, x ∈∈∈∈ Rn , e y ∈∈∈∈ Rn ; las
operaciones básicas con vectores incluyen la multiplicación de un escalar por
un vector,
z = ax ⇒⇒⇒⇒ zi = axi,
10
Adición de vectores,
z = x + y ⇒⇒⇒⇒ zi = xi+ yi,
Producto punto (o producto interior),
c = xTy ⇒⇒⇒⇒ c = ∑=
n
i
ii yx1
Y el producto vectorial (o el producto de Hadamard)
z = x. * y ⇒⇒⇒⇒ z = xiyi
Otra operación muy importante es la operación saxpy,
y = ax +y ⇒⇒⇒⇒ y = axi + yi
Aquí el símbolo “=” se utiliza para denotar asignación, no la igualdad
matemática; mediante esta operación el vector y es modificado. El nombre
saxpy es usado en LAPACK, un paquete de software que implementa
muchos de los algoritmos que manejan operaciones con matrices. La palabra
saxpy es el mnemotécnico del producto escalar ax + y.
11
3.1.5 Particionando una matriz en filas y columnas. Desde el punto de
vista de la fila, una matriz es una pila de vectores fila:
A ∈∈∈∈ Rmxn ⇔⇔⇔⇔ A =
T
m
T
r
r
...
1
rk ∈∈∈∈ Rn
Esta es llamada una partición fila de A. De esta forma, la partición por filas de
65
43
21
es la siguiente colección de filas
[ ]211 =Tr , [ ]432 =
Tr , [ ]653 =T
r
Alternativamente, una matriz es una colección de vectores columna:
A ∈∈∈∈ Rmxn ⇔⇔⇔⇔ A = [c1, …, cn], ck ∈∈∈∈ Rm .
Lo anterior se conoce como a la partición columna de A. En el ejemplo de la
matriz 3 por 2 anterior, aparecerán las columnas c1 y c2 respectivamente.
12
=
5
3
1
1c
=
6
4
2
2c
3.1.6 La notación coma. Una forma de manejar una columna o fila
específica de la matriz A es con la notación coma. Si A ∈∈∈∈ Rmxn , entonces
A(k, :) designa la k-ésima fila, es decir;
A(k,:) = [ ak1, ak2, …, akn]
=
nk
k
k
a
a
a
c...
2
1
1
Una aplicación preliminar de la notación coma, es entender la actualización
del producto exterior.
A = A + xyT; A ∈∈∈∈ Rmxn; x ∈∈∈∈ Rm; y∈∈∈∈ Rn
3.1.7 Multiplicación matriz por matriz. Se parte de la multiplicación matriz
por matriz 2 por 2 AxB; en la formulación del producto interno cada entrada
es calculada como un producto interior:
13
++
++=
84637453
82617251
87
65
43
21
xxxx
xxxx
En la versión producto interno, cada columna en el producto es mirada como
una combinación lineal de las columnas de A:
+
+
=
4
28
3
16,
4
27
3
15
87
65
43
21.
Finalmente, en la versión de producto externo, el resultado es mirado como
la suma de productos externos:
[ ] [ ]874
265
3
1
87
65
43
21
+
=
.
Aunque matemáticamente son equivalentes, estas versiones de
multiplicación de matrices pueden salirse de un determinado alcance debido
a los diferentes niveles de capacidad de memoria en la ejecución.
3.1.8 Especificaciones de nivel escalar. Para precisar la discusión es
conveniente enfocarse en la siguiente actualización de multiplicación de
matrices:
14
C = AB + C A ∈∈∈∈ Rmxp, B∈∈∈∈ Rpxn, y C∈∈∈∈ Rmxn.
El punto de arranque es el familiar algoritmo de loop triplemente anidado:
Algoritmo 5 (multiplicación de matrices: variante ijk ) Si A ∈∈∈∈ Rmxp, B∈∈∈∈
Rpxn, y C∈∈∈∈ Rmxn, son matrices dadas, entonces este algoritmo sobre-escribe
en la matriz C el valor de AB +C.
for i= 1:m
for j= 1:n
for k= 1:p
C(i, j) = A(i, k) B(k, j) + C(i,j)
end
end
end
Esta es la variante i, j, k porque identificamos las filas de C (y las de A) con i,
las columnas de C ( y las de B) con j, y el índice de suma con k.
Se considera la actualización de C = AB +C en vez de justamente C = AB
por dos razones: No tener que incomodarse con las inicializaciones y
15
actualizaciones de la forma C = AB +C que se presentan con mucha
frecuencia en la práctica.
Los tres loops en la actualización de la multiplicación de matrices pueden ser
ordenados arbitrariamente dando lugar a 6 variaciones. De esta forma
for j = 1:n
for k= 1:p
for i= 1:m
C(i, j) = A(i, k) B(k, j) + C(i,j)
end
end
end
es la variante j, k, i. Cada una de las 6 posibilidades ( ijk, jik, ikj, jki, kij, kji )
caracterizan una operación de loop interior ( producto interno) y tiene su
propio patrón de flujo de datos. Por ejemplo en la variante ijk, el loop interior
muestra un producto punto que requiere acceso a una fila de A y una
columna de B. La variante jki involucra un procedimiento de producto interno
que requiere acceso a una columna de C y a una columna de A. Estos
atributos pueden analizarse para cada una de las otras variantes
16
3.1.9 Formulación de un producto punto. El procedimiento usual de
multiplicación de matrices mira al producto AB como un arreglo de productos
punto que va a ser calculado al tiempo en el orden de izquierda a derecha,
de arriba hacia el fondo.
Esta es la idea del algoritmo 5. Usando la notación coma podemos aclarar la
formulación de este producto punto:
Algoritmo 6 (Multiplicación de matrices: versión producto punto) Si A ∈∈∈∈
Rmxp, B∈∈∈∈ Rpxn, y C∈∈∈∈Rmxn, son matrices dadas, entonces este algoritmo
sobre escribe en la matriz C el valor AB + C.
for i = 1: m
for j= 1:n
C(i, j) = A(i, : )B(: , j) + C(i, j)
end
end
En el lenguaje de matrices particionadas, si
=T
m
T
a
a
A ...
1
ak ∈∈∈∈ Rp
17
y B = [ b1, …, bn ] bk ∈∈∈∈ Rp
entonces el algoritmo 6 tiene esta interpretación:
for i = 1: m
for j= 1:n
cij = ijj
T
i cba +
end
end
La misión del loop j es calcular la i-ésima fila de la actualización. Para
enfatizar esto se puede escribir:
for i = 1:m
T
i
T
i
T
i cBac +=
end
Donde:
=T
m
T
c
c
C ...
1
18
Es una fila de la partición de C. Para decir lo mismo con la notación coma se
escribe:
for i = 1:m
:),(:),(),( iCBiAjiC +=
end
En cualquier forma, se observa que el interior de los dos loops de la variante
i, j, k definen una operación gaxpy orientada por fila.
3.1.10 Una formulación Saxpy. Suponiendo que A y C son matrices con
partición columna como sigue:
A = [ a1, …, ap] aj ∈∈∈∈ Rm
B = [ c1,…, cn] cj ∈∈∈∈ Rm
Al comparar las j-ésimas columnas de C = AB + C se ve que
∑=
+=p
k
jkkjij cabc1
, j= 1:n
19
Esta suma de vectores puede ser puesta simultáneamente con una
secuencia de actualizaciones saxpy.
Algoritmo 7 (Multiplicación de matrices: versión Saxpy)
Si las matrices A ∈∈∈∈ Rmxp, B∈∈∈∈ Rpxn, y C∈∈∈∈Rmxn, son dadas, entonces este
algoritmo sobre escribe C con AB + C.
for j = 1: n
for k= 1:p
C(: , j) = A(: ,k)B(k, j) + C(:, j)
end
end
El loop k deja ver una operación gaxpy
for j= 1:n
C(: , j) = AB(: ,j) + C(:, j)
end
3.1.11 Una formulación de producto externo. Dada la variante k, i, j del
algoritmo 5:
20
for k = 1: p
for j= 1:n
for i = 1: m
C(i, j) = A(i,k)B(k, j) + C(i, j)
end
end
end
Los dos loops internos dejan ver la actualización del producto externo:
CbaCT
kk +=
Donde:
A = [ a1 , …, ap ] y
=T
p
T
b
b
B ...
1
Con ak ∈∈∈∈Rm y bk ∈∈∈∈ Rn . Por lo tanto se obtiene:
Algoritmo 8 ( Multplicación de matrices: Versión producto externo)
Si A ∈∈∈∈ Rmxp, B∈∈∈∈ Rpxn, y C∈∈∈∈Rmxn, son matrices dadas, entonces este
algoritmo sobrescribe en la matriz C el valor AB + C.
21
for k = 1: p
C= A(:,k)B(k, :) + C
end
Esto recalca el hecho de que AB es la suma de p productos externos.
3.1.12 Una nota sobre ecuaciones de matrices. En un esfuerzo por
entender la multiplicación de matrices vía productos externos, se ha
establecido la ecuación matricial:
∑=
=p
k
T
kk baAB1
Donde ak y bk son definidos por la partición del algoritmo 3.
Numerosas ecuaciones de matrices se han desarrollado y algunas de ellas
son establecidas algorítmicamente como la expansión del producto externo
anterior y otras veces son probadas a nivel del componente ij. El siguiente
ejemplo prueba un resultado reciente e importante que caracteriza la
transpuesta de productos.
Teorema 1. Si A ∈∈∈∈ Rmxp, B∈∈∈∈ Rpxn, entonces, (AB)T = BT AT.
Prueba: Si C = (AB)T , entonces:
22
∑=
===p
k
kjjkjiij
T
ij baABABc1
][)( .
De otra parte, si D = BT AT, entonces:
∑ ∑= =
===p
K
p
k
jkkikj
T
ik
T
ij
TT
ij abABABd1 1
][][][ .
Como cij = dij para todo i y j, se sigue que C=D.
3.1.13 Matriz inversa. La matriz identidad Inxn es definida por la partición
columna
In = [e1,…, en]
Donde ek es el k-ésimo vector canónico:
ek= (0,…,0, 1, 0, …, 0 )T
Los vectores canónicos se presentan frecuentemente en análisis de matrices
y si su dimensión es ambigua, se usa un superíndice, ejemplo: nn
k Re ∈)(
23
Si A y X son matrices en Rnxn y satisfacen AX = I, entonces, X es la inversa
de A y se denota por A-1. Si A-1 existe, entonces A se dice no singular. De
otra manera, se dice que es singular.
Varias propiedades de la matriz inversa juegan un rol importante en el cálculo
de matrices. La inversa de un producto es el producto conmutado de las
inversas.
.)( 111 −−−= ABAB
La transpuesta de la matriz inversa es la inversa de la matriz transpuesta:
TTT AAA −−−≡=
11 )()( .
La identidad
1111 )( −−−−−−= AABBAB
muestra como la inversa cambia si la matriz cambia.
24
La fórmula de Sherman-Morrison-Woodbury da una expresión conveniente
para la inversa de (A+UVT) donde A∈∈∈∈Rnxn y U y V son matrices de dimensión
KxK:
111111 )()( −−−−−−+−=+ AVUAVIUAAUVA TTT .
Una corrección k a una matriz resulta en una corrección k de la inversa.
En la ecuación inmediatamente anterior, tanto A como (I + VTA-1U) son no
singulares. Cualquiera de estos hechos puede ser verificado justamente
mostrando que la inversa propuesta cumple el resultado. Por ejemplo, aquí
es como confirmar la identidad arriba mencionada.
.)())(( 11111 IAABBAAABBAB =−−=−−−−−−−
3.1.14 El determinante. Si A = (a) ∈∈∈∈ R1x1, entonces su determinante está
dado por det(A) = a. El determinante de A ∈∈∈∈ Rnxn, es definido en términos de
determinantes de orden (n-1).
Aquí, A1j es una matriz (n-1)x(n-1) obtenida al eliminar la primera fila y la j-
ésima columna de A. Las propiedades útiles de los determinantes incluyen:
25
Det(AB) = det(A)det(B) A,B ∈∈∈∈ Rnxn .
Det(AT) = det (A) A∈∈∈∈ Rnxn .
Det (cA) = cndet(A) c∈∈∈∈R, A∈∈∈∈ Rnxn .
Det(A) ≠≠≠≠ 0 ⇔⇔⇔⇔ A es no singular A∈∈∈∈ Rnxn .
3.2 SISTEMAS DE ECUACIONES LINEALES
En el cálculo científico es muy probable tener que resolver el siguiente
problema: Dada una matriz Anxn y un vector bnx1 debe resolverse el vector
x(nx1). Esto es, hallar X de tal forma que Ax = b. Este es el problema de
solución de un sistema de n ecuaciones lineales en n incógnitas.
Entendiendo que ya existe alguna experiencia en la solución de sistemas de
ecuaciones lineales, se mencionarán solo algunos conceptos teóricos
básicos y después se observarán algunos ejemplos para recordar como
pueden presentarse sistemas lineales en problemas científicos. Estos
conceptos resultan de gran importancia, toda vez que se aplican en el cálculo
de la matriz inversa, mediante la factorización LU.
3.2.1 No singularidad y unicidad de soluciones. Dado sistema de n
ecuaciones lineales en n incógnitas:
26
nnnnnn
nn
nn
bxaxaxa
bxaxaxa
bxaxaxa
=+++
=+++
=+++
...
...........................
...
...
2211
22222121
11212111
(1)
Los coeficientes aij y bi se suponen dados, y se desea hallar x1, x2, …, xn
que satisfagan las ecuaciones. En la mayoría de las aplicaciones, los
coeficientes son números reales y se busca una solución real. Por lo tanto,
se enfocará la atención a sistemas reales. Sin embargo, todo lo que se haga
puede ser llevado al campo de los números complejos.
Puesto que es tedioso sobrescribir la ecuación (1) una y otra vez, se
acostumbra escribir una ecuación matricial simple:
Ax = b, (2)
Donde:
=
=
=
nnnnnn
n
n
b
b
b
b
x
x
x
x
aaa
aaa
aaa
A...
...
...
............
...
...
2
1
2
1
21
22221
11211
.
27
A y b son dados, y se debe resolver x. A es una matriz cuadrada; ella tiene n
filas y n columnas.
La ecuación (2) tiene una única solución si y solamente si la matriz A es no
singular.
Primero se define alguna terminología estándar. La matriz identidad n x n es
denotada por In. Esta es la única matriz tal que AI = IA = A para toda
nnRA ×∈ . La matriz identidad tiene 1’s sobre la diagonal principal y 0’s en el
resto de la matriz.
Dada una matriz A, si existe una matriz B tal que AB = BA = I, entonces B se
llama la inversa de A y se denota A-1. No toda matriz tiene inversa.
Teorema 2: Sea A una matriz cuadrada. Las siguientes 6 condiciones son
equivalentes; esto es, si cualquiera se cumple, todas se cumplen:
a) A-1 existe.
b) Hay un valor y ≠ 0 tal que Ay = 0.
c) Las columnas de A son linealmente independientes.
d) Las filas de A son linealmente independientes.
e) El det(A) ≠ 0
28
f) Dado cualquier vector b, hay exactamente un vector x de tal forma
que Ax = b.
En la condición (b), el símbolo 0 representa el vector cuyas posiciones son
todas cero. En la condición (e), el símbolo 0 representa el número real cero.
Det(A) denota el determinante de A.
Si las condiciones del teorema 1 permanecen, A se dice que es una matriz
no singular o invertible. Si las condiciones no permanecen, A se dice que es
una matriz singular o no invertible. En este caso, la ecuación (2) no tiene
solución ó tiene infinitas soluciones.
Si A es no singular, la única solución de (2) puede ser obtenida en principio
por la multiplicación a ambos lados por A-1. A partir de Ax = b se obtiene A-
1Ax = A-1b, y además A-1A = I, la matriz identidad, x = A-1b. Esta ecuación
resuelve completamente el problema en teoría pero el método de solución
que se sugiere primero calcula A-1, luego se multiplica A-1 por b para obtener
x, que resulta ser ineficiente. Como se verá, generalmente es más apropiado
resolver Ax = b directamente sin calcular A-1. En la mayoría de los problemas
grandes, la economía en cómputo y almacenamiento evitando el cálculo de
A-1 son verdaderamente espectaculares. Sin embargo, cuando el objetivo es
llegar a A-1, este es el procedimiento adecuado.
29
3.3 SISTEMAS TRIANGULARIZADOS
3.3.1 Sistemas Triangulares. Un sistema lineal cuya matriz de coeficientes
es triangular es particularmente fácil de resolver. Por esta razón se
acostumbra reducir sistemas generales a una forma triangular, para
resolverlos fácilmente.
Una matriz ( )ijgG = es triangular inferior si 0=ijg siempre que i < j. de esta
manera, una matriz triangular inferior tiene la forma
=
nnnnn gggg
ggg
gg
g
G
...
0............
......
0...0
0...00
321
333231
2221
11
Similarmente, una matriz triangular superior es aquella para la cual 0=ijg
siempre que i > j. Una matriz triangular es cualquiera superior o inferior
matriz triangular.
Teorema 3. Sea G una matriz triangular. Entonces, G es no singular si y
solamente si 0≠iig para i = 1,…, n
30
Prueba: Se recalca del álgebra lineal elemental que si G es triangular,
entonces el determinante de G, ( ) nngggG ...det 2211= . De este modo ( ) 0det ≠G
si y solamente si 0≠iig para i = 1,…, n.
3.3.2 Sistemas triangulares inferiores. Dado el sistema Gy = b, donde G
es una matriz triangular inferior no singular, es fácil ver como se resuelve
este sistema si se escribe en detalle:
nnnnnnn bygygygyg
bygygyg
bygyg
byg
=++++
=++
=+
=
...
.....................
332211
3333232131
2222121
1111
La primera ecuación involucra solamente a y1 desconocido, la segunda
involucra a y1 y y2 y así sucesivamente. Se resuelve primero la ecuación
para y1:
11
11
g
by =
Partiendo de que G es no singular, se garantiza que 011 ≠g . Ahora que se
tiene y1, se puede sustituir este valor en la segunda ecuación y se resuelve
esa ecuación para y2:
31
( )
22
12122
g
ygby
−= .
Como G es no singular, 022 ≠g . Ahora que se conoce y2, se puede usar la
tercera ecuación para resolver y3, y así sucesivamente. En general, una vez
que se tiene y1, y2, …, yi-1, se puede resolver para yi, usando la ecuación i-
ésima:
ii
iiiiii
ig
ygygygby
11,2211 ...−−
−−−−= ,
la cual puede expresarse mas sucintamente de la siguiente forma:
−= ∑
−
=
−1
1
1i
j
jijiiii ygbgy (3)
De nuevo, como G es no singular, 0≠iig , lo que permite el cálculo de gii-1.
Este algoritmo para resolver un sistema triangular inferior es llamado
algoritmo de sustitución forward (hacia delante) ó de eliminación forward.
Este es el primero de dos versiones que se considerarán. Es llamado
sustitución forward orientado por filas porque el acceso a G es por filas; la i-
32
ésima fila es usada en el i-ésimo paso. También es llamado la forma
producto interno de sustitución forward porque la suma ∑−
=
1
1
i
j jij yg puede ser
observada como un producto interno ó producto punto.
La ecuación (3) describe completamente el algoritmo; incluso describe el
primer paso 11
11
g
by = , si se está de acuerdo con el hecho de que siempre que
el límite inferior de una sumatoria sea mayor que el límite superior de ella, la
suma es cero. De esta forma:
11
1
11
1
11
0
1
11
1
0
g
b
g
b
g
ygb
yj
jj
=−
=
−
=
∑= .
Sería fácil escribir un programa de computador para eliminación forward.
Antes se escribe el algoritmo, y se nota que b1 sólo es usado para calcular
y1; b2 es usado solamente para calcular y2, y así sucesivamente. En general,
una vez que se ha calculado yi, no es necesario bi. Por lo tanto es usual en
un programa de computador almacenar y sobre b. de esta forma, se tiene un
arreglo sencillo que contiene a b antes de que el programa sea ejecutado y
luego contiene a y después de que el programa se ejecute. El algoritmo se
observa así:
33
for i = 1, …, n
for j = 1, …, i – 1 (no se ejecuta para i = 1)
[ bi ← bi – gij bj (4)
if gii = 0, set error flag, exit
bi ← ii
i
gb
No hay referencias para y, porque es almacenado en el arreglo llamado b. El
chequeo de gii es incluido para hacer la prueba completa del programa
seguro. No hay nada que garantice que el programa no producirá
coeficientes de una matriz singular. El programa necesita responder
adecuadamente a esta situación. Es buena la práctica de chequear antes de
cada división para que el divisor no sea cero. En la mayoría de los algoritmos
de álgebra lineal, estos chequeos no contribuyen significativamente en el
tiempo que toma la corrida del programa, porque la operación división es
ejecutada muy pocas veces.
Para tener una idea del tiempo de ejecución de la sustitución forward, se
cuentan las operaciones de punto flotante (flops). En el loop interior de (4),
son ejecutados dos flops. Estos flops son ejecutados i – 1 veces sobre cada
i-ésima vez del loop externo. El loop externo es ejecutado n veces, así que
el número total de flops ejecutados en el j-ésimo loop es
( ) ( )∑ =−=−++++×
n
iin
1121...2102 . Calculando esta suma por un truco bien
34
conocido, se obtiene n(n-1), que se aproxima bien con n2. Estas
consideraciones son resumidas por las ecuaciones
( ) ( )∑∑ ∑=
−
= =
≈−=−=n
i
i
j
n
i
nnni1
1
1 1
21122
Mirando las operaciones que son ejecutadas fuera del loop j, se ve que gii es
comparado con cero n veces, y hay n divisiones. Sin tener en cuenta lo que
cuesta cada una de estas operaciones, el costo total de hacer todo es
proporcional a n y no a n2, y por lo tanto será insignificante si n es totalmente
grande. Haciendo esta conjetura, se ignoran los costos más bajos y se
establece simplemente que el costo de hacer sustitución forward es n2 flops.
El análisis anterior proporciona una valiosa información cualitativa. Se puede
esperar que cada vez que n se duplique, el tiempo de ejecución de
sustitución forward será multiplicado aproximadamente por 4.
3.3.3 Sustitución forward orientada por columnas. Ahora se deduce una
versión de sustitución forward orientada por columna. Se particiona el
sistema Gy = b como sigue:
=
b
b
y
y
Gh
g
ˆˆˆˆ
0 1111 . (5)
35
by y ,h son vectores de longitud n-1 y G es una matriz triangular inferior (n-
1)(n-1). El sistema particionado puede ser escrito como
byGh
bg
=+
=
ˆˆˆ111
Esto conduce al siguiente algoritmo:
yforbyGsolve
yhbb
gby
ˆ~
ˆˆ
ˆˆ~/
1
1111
=
−=
=
(6)
Este algoritmo reduce el problema de resolver un sistema triangular nxn al
de un sistema byG~
ˆˆ = de tamaño (n-1)x(n-1). Este problema más pequeño
puede ser reducido (por el mismo algoritmo) a un problema de orden (n-2),
que puede a su vez ser reducido a un problema de orden (n-3), y así
sucesivamente. Eventualmente obtenemos el problema 1x1 nnnn byg~
= , el
cual tiene la solución nnnn gby /~
= .
Un ejemplo de este procedimiento es el siguiente:
36
−=
−
10
2
15
321
042
005
3
2
1
y
y
y
.
Primero se calcula .35
1511
11 ===
gb
y Luego
−=
−
−=−=
7
83
1
2
10
2ˆˆ~1yhbb .
Ahora se debe resolver :~
ˆˆ byG =
−=
−
7
8
32
04
3
2
y
y.
Se alcanza esto repitiendo el algoritmo: y2= -8/-4 =2,
]3[2]2[]7[ˆ~~~
2 =−=−= yhbb ,
[3]y3 = [3], y y3=3/3=1. De este modo
=
1
2
3
y .
37
Se puede verificar esto al multiplicar G por y, obteniendo el resultado
correcto de b.
3.3.4 Sistemas triangulares superiores. Tal como puede esperarse, los
sistemas triangulares superiores pueden ser resueltos, en su mayoría, en la
misma forma como se resuelven los sistemas triangulares inferiores.
Considere el sistema Ux = y, donde U es una matriz triangular superior.
Escribiendo aparte el sistema se obtiene:
nnnn
nnnnnnn
nnnn
nnnn
yxu
yxuxu
yxuxuxu
yxuxuxuxu
=
=+
=+++
=++++
−−−−−
−−
−−
,
1,111,1
2,211,2222
1,111,1212111
...............
...
...
Es claro que el sistema se resolvería desde el fondo hacia arriba. La n-ésima
ecuación puede ser resuelta para xn, entonces la ecuación (n-1) puede ser
resuelta para xn-1, y así sucesivamente. El proceso es llamado “back
substitution” y tiene versiones orientadas por fila y por columna. El costo de
la sustitución hacia atrás es obviamente el mismo que el de sustitución hacia
delante, alrededor de n2 iteraciones.
38
3.3.5 Algoritmos para bloqueo de matrices. Es fácil desarrollar variantes
de bloques para forward substitution como para back substitution. Suponga
que la matriz triangular inferior se ha particionado en bloques de la siguiente
forma:
G =
sssss GGG
GG
G
r
r
r
...
............
0...
0...0
...
r ... r r
21
2221
11
2
1
s21
Cada iiG es una submatriz cuadrada y triangular inferior. Entonces la
ecuación bGy = puede ser escrita en forma particionada:
=
ssssss b
b
b
y
y
y
GGG
GG
G
......
...
............
0...
0...0
2
1
2
1
21
2221
11
(7)
En esta ecuación las entradas bi y yi no son escalares; ellas son vectores
con ri componentes cada una. La ecuación (7) sugiere que se halle y1
resolviendo el sistema 1111 byG = . Una vez se obtenga y1, se puede resolver
la ecuación 2222121 byGyG =+ para y2, y así sucesivamente. Esto conduce al
bloque de la versión “forward substitution” orientada por filas:
39
[
←
−←
==
=
−
iii
jiji
bG
if
bGb
for
1
i
ii
i
b
salgay error, de bandera coloque singular, es G
b
1)i cuando ejecuta se (no 1-i1,...,jfor
s ..., 1, i
(8)
La operación bGb iii
1−← no requiere el cálculo explícito de 1−
iiG . Se puede
efectuar resolviendo el sistema triangular inferior iii bxG = por “forward
substitution” orientado por filas o por columnas.
3.4 MÉTODOS DE DESCOMPOSICIÓN
3.4.1 Descomposición LU. El esquema de descomposición LU es una
transformación de una matriz A como producto de dos matrices,
LUA =
Donde L es una matriz triangular inferior y U es una matriz triangular
superior. Cuando se deben resolver varios conjuntos de ecuaciones lineales
en los que todas las matrices de coeficientes son iguales pero los términos
no homogéneos (lado derecho) son distintos, la solución de las ecuaciones
40
utilizando la descomposición LU tiende a ser más eficiente que la eliminación
de Gauss.
La descomposición LU para una matriz 3 x 3 se ilustra de la manera
siguiente:
=
3,3
3,22,2
3,12,11,1
2,31,3
1,2
3,32,31,3
3,22,21,2
3,12,11,1
00
0
1
01
001
u
uu
uuu
ll
l
aaa
aaa
aaa
(9)
Conviene observar que los elementos de la diagonal de L valen 1
Para evaluar jiu , y jil , en la ecuación (9) sin pivoteo, primero se multiplica el
primer renglón de L por cada columna de U y se compara el resultado con el
primer renglón de A. Se tiene entonces que el primer renglón de U es
idéntico al de A:
jj au ,1,1 = , j = 1 a 3
Se multiplica el segundo y tercer renglones de L por la primera columna de U
respectivamente, y se compara con el lado izquierdo para obtener
41
1,11,21,2 ula = , 1,11,31,3 ula =
O en forma equivalente
1,1
1,21,2 u
al = ,
1,1
1,31,3 u
al = (10)
Se multiplica el segundo renglón de L por la segunda y tercera columnas de
U y se comparan con el lado izquierdo para obtener
2,22,11,22,2 uula += , 3,23,11,23,2 uula +=
O bien
2,11,22,22,2 ulau −= , 3,11,23,23,2 ulau −= (11)
Se multiplica el tercer renglón de L por la segunda columna de U y se obtiene
2,22,32,11,32,3 ulula +=
O, en forma equivalente,
42
[ ]2,2
2,11,32,32,3 u
ulal
−= (12)
Finalmente, 3,3l se obtiene multiplicando la última columna de U por el último
renglón de L y se iguala a 3,3a como sigue
3,33,33,22,33,11,3 auulul =++
O bien
3,22,33,11,33,33,3 ululau −−= (13)
El esquema general de la descomposición LU para una matriz de orden N es
el siguiente:
a) El primer renglón de U, jiu . para j = 1 hasta N, se obtiene por medio
de
jj au ,1,1 = , j = 1 hasta N (14)
b) La primera columna de L, 1il para i = 2 hasta N, se obtiene por medio
de
43
1,1
1,1, u
al i
i = , i = 2 hasta N (15)
c) El segundo renglón de U se obtiene como
jjj ulau ,11,2,2,2 −= , j = 2 hasta N (16)
d) La segunda columna de L se obtiene mediante
[ ]2,2
2,11,2,2, u
ulal ii
i
−= , i = 3 hasta N (17)
e) El n-ésimo renglón de u se obtiene de
∑−
=
−=1
1
,,,,
n
k
jkknjnjn ulau , j = n hasta N (18)
f) La n-ésima columna de L se obtiene de
nn
n
k
nkkini
ni u
ula
l,
1
1
,,,
,
−
=∑
−
= , i = n + 1 hasta N (19)
44
En el proceso anterior, no se calculan los elementos de la diagonal de L, es
decir, iil , , puesto que todos valen 1.
Como se habrá observado, los elementos de la parte triangular superior de L
son iguales a cero. También los elementos de la parte triangular inferior de la
matriz U se anulan. Por lo tanto, los elementos de L y U se pueden guardar
en un arreglo con el fin de ahorrar espacio en la memoria. Por ejemplo, las
matrices L y U de la ecuación (9) se pueden combinar en un arreglo como:
3,32,31,3
3,22,21,2
3,12,11,1
ull
uul
uuu
En este arreglo, los elementos de la diagonal de L no se guardan porque
valen 1. Para reducir aún más el uso del espacio en la memoria, los
resultados de la factorización se escriben encima del espacio de memoria de
A. Esto es posible debido a que cada elemento jia , de A se utiliza sólo una
vez para calcular jil , o jiu , en toda la factorización. Por lo tanto, al utilizar
jia , , su espacio de memoria se puede utilizar para guardar jil , o jiu ,
Para resolver un conjunto de ecuaciones lineales, la ecuación yAx = se
puede escribir como
45
yLUx = (20)
Donde ALU = . La ecuación (20) se resuelve como sigue. Sea
zUx =
La ecuación (20) queda
yLz = (21)
La solución de la ecuación (21) para z es fácil, debido a la forma triangular de
L. Una vez que se conoce z, se resuelve el sistema en términos de x.
En el caso de una matriz de 3 x 3, por ejemplo, podemos escribir la ecuación
(21) como
=
3
2
1
3
2
1
2,31,3
1,2
1
01
001
y
y
y
z
z
z
ll
l (22)
La solución se calcula en forma recursiva como
46
[ ][ ]2,321,3133
1,2122
11
lzlzyz
lzyz
yz
−−=
−=
=
(23)
Se escribe el sistema en forma más explicita:
=
3
2
1
3
2
1
3,3
3,22,2
3,12,11,1
00
0
z
z
z
x
x
x
u
uu
uuu
Y la solución es
1,1
33,122,11
1
2,2
33,22
2
3,3
33
u
xuxuzx
u
xuzx
u
zx
−−=
−=
=
Para una matriz de orden N, las eliminaciones con las versiones forward
substitution y back substitution se resumen de la forma siguiente
a) Paso de eliminación con la versión forward substitution
47
−=
=
∑−
=
1
1
,
11
i
j
jjiii zlyz
yz
, i = 2, 3, …, N
b) Paso de eliminación con la versión back substitution
ii
N
ij
jjii
i
NN
N
N
u
xuz
x
u
zx
,
1
,
,
−
=
=
∑+=
, i = N – 1, N – 2, …, 3, 2, 1
En el proceso de cálculo de la matriz inversa, la factorización LU resulta de
gran importancia, dado que se podría expresar la operación de la forma:
AA-1 = I
Así, se puede descomponer la matriz I en sus diferentes columnas,
obteniendo un conjunto de sistemas de ecuaciones lineales, así:
A A-1:,1 =
0
...
0
1
, A A-1:,2 =
0
...
1
0
, ..., A A-1:,n =
1
...
0
0
48
Cada uno de estos sistemas tendrá solución para las incógnitas de A-1:,j ,
para j = 1, 2, ..., n, resultando en el conjunto solución que representa a la
matriz inversa.
4 LA LIBRERÍA PROPUESTA
La librería propuesta se presenta en el anexo No. 1.
5 CONCLUSIONES
1. Al hacer uso de la factorización LU para el cálculo de la matriz
inversa, se observa que el proceso de paralelización se presenta de
forma natural. Cada una de las columnas de la matriz inversa puede
ser calculada de manera independiente, teniendo las matrices L y U
como insumos.
2. El proceso de paralelización garantiza que, para matrices de gran
tamaño, las operaciones que representen alto procesamiento, como el
cálculo de la matriz inversa o el producto de matrices, se realicen de
manera eficiente.
3. La implementación de la librería propuesta, resulta de gran utilidad
para fines académicos, en tanto se puedan realizar desarrollos
posteriores que requieran su utilización.
4. En la propuesta de librería presentada, se parte de la paralelización de
los procesos. Sin embargo, resulta viable mediante esta metodología,
51
la implementación de paralelismo de datos, en tanto se puede
evidenciar que el cálculo de algunos componentes puede realizarse de
manera independiente.
5. En el cálculo de la matriz inversa usando la factorización LU, resulta
interesante observar que, para cualquiera de las columnas de la matriz
inversa, las matrices L y U requeridas en su cálculo, son las mismas.
Esto en sí mismo, es lo que facilita el proceso de paralelización.
52
6 BIBLIOGRAFÍA
1. DEMMEL, James W. Applied Numerical Linear Algebra. Philadelphia;
Ed. SIAM (Society for industrial and Applied Mathematics), 1997.
Capítulos 1 y 2.
2. DONGARRA, Jack J., et al. Solving Linear Systems on vector and
Shared Memory Computers. Philadelphia; Ed. SIAM (Society for
industrial and Applied Mathematics), 1991. Págs. 75 a 107
3. GALLIVAN, Michael T., HEATH, Esmond et al. Parallel algorithms for
matrix computations, 1990. Págs. 83 a 119.
4. GOLUB, Gene H. y VAN LOAN, Charles F. Matrix Computations.
Baltimore and London; Ed. The johns Hopkins University Press, 1996,
Págs. 1 a 46
5. Lancaster numerical análisis summer School. Numerical Analysis and
parallel proccesing. Ed. Springer Verlag, 1987. Págs. 2 a 22.
6. LEZCANO BRITO, Mateo G., Curso de Computación Paralela.
Universidad Central de las Villas. Cuba, 2006.
7. NAKAMURA, Shoichiro. Métodos numéricos aplicados con software.
México D.F.; Ed. Prentice Hall, 1992. Págs.196 a 219.
53
8. TREFETHEN, Lloyd N. y BAU, David. Numerical Linear Algebra.
Philadelphia; Ed. SIAM (Society for industrial and Applied
Mathematics), 1997. Págs. 147 a 154.
9. WATKINS, David S. Fundamentals of matrix computations. New York;
Ed. Wiley Interscience, 2002. Págs. 11 a 90.
6.1 WEBGRAFÍA
1. Clasificación de arquitecturas avanzadas, en:
http://lisisu02.usal.es/~bcurto/docencia/arquitectura/pdf_arq/2_tema1.pdf