Randall Romero Aguilar, PhD
Transcript of Randall Romero Aguilar, PhD
Tema 2
Ecuaciones lineales
Randall Romero Aguilar, PhD
Universidad de Costa RicaSP6534 - Economía Computacional
I Semestre 2020Última actualización: 10 de marzo de 2020
Tabla de contenidos
1. Introducción
2. Eliminación gaussiana
3. Error de redondeo
4. Pivoteo
5. Mal condicionamiento
6. Matrices dispersas
1. Introducción
Ecuación lineal
Una ecuación lineal de dimensión n tiene la forma
Ax = b
donde
A es una matriz n× n conocidab es un vector n× 1 conocidox es un vector n× 1 desconocido a ser determinado
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 1
Las ecuaciones lineales están en todas partes en economíacomputacional
É Las ecuaciones lineales surgen naturalmente en muchasaplicaciones:É modelos lineales de equilibrio de mercados multi-mercancíaÉ modelos de mercados financiero de estado finitoÉ modelos de cadenas de MarkovÉ mínimos cuadrados ordinarios
É Las ecuaciones lineales surgen más frecuentemente demanera indirecta, cuando se resuelven modelos económicosde ecuaciones no lineales y funcionales:É modelos no lineales de equilibrio de mercados multi-mercancíaÉ modelos estáticos de juegos multi-jugadorÉ modelos de optimización dinámicaÉ modelos de expectativas racionales
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 2
É Como las ecuaciones lineales son fundamentales enaplicaciones de economía computacional, las estudiamosdetenidamente.É En la práctica, a menudo necesitaremos resolver sistemas muy
grandes de ecuaciones lineales, muchas veces.É Por ello, la velocidad de ejecución, requerimientos de
almacenamiento en memoria, y errores de redondeo cobranmucha importancia.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 3
2. Eliminación gaussiana
Eliminación gaussiana
É Una ecuación lineal puede resolverse usando eliminacióngaussiana.É Este proceso utiliza operaciones elementales de fila:É intercambiar dos filasÉ multiplicar una fila por una constante distinta de ceroÉ sumar un múltiplo de una fila a otra fila
É Las operaciones elementales de fila alteran la forma de unaecuación lineal sin cambiar su solución.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 4
Ejemplo 1:Eliminación gaussiana
É Resolvamos por eliminación gaussiana esta ecuación lineal1 1 23 4 82 1 1
x1x2x3
= 5
186
,É ... la cual puede escribirse así
x1 + x2 + 2x3 = 53x1 + 4x2 + 8x3 = 182x1 + x2 + x3 = 6
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 5
Empezando con sumamos la fila 2 a la 3x1 + x2 + 2x3 = 5 x1 + x2 + 2x3 = 5
3x1 + 4x2 + 8x3 = 18 x2 + 2x3 = 32x1 + x2 + x3 = 6 − x3 = −1
sumamos -3 veces la fila 1 a la 2 multiplicacmos la fila 3 por -1x1 + x2 + 2x3 = 5 x1 + x2 + 2x3 = 5
x2 + 2x3 = 3 x2 + 2x3 = 32x1 + x2 + x3 = 6 x3 = 1
sumamos -2 veces la fila 1 a la 3 Resolvemos por recursión hacia atrásx1 + x2 + 2x3 = 5 x3 = 1
x2 + 2x3 = 3 x2 = 3− 2x3 = 1− x2 − 3x3 = −4 x1 = 5− x2 − 2x3 = 2
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 6
Confirmamos que la solución calculada es correcta verificando que1 1 23 4 82 1 1
211
= 5
186
o equivalentemente,
1 · 2 + 1 · 1 + 2 · 1 = 53 · 2 + 4 · 1 + 8 · 1 = 182 · 2 + 1 · 1 + 1 · 1 = 6
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 7
É En el ejemplo anterior, usamos operaciones elementales defila para anular términos debajo de la diagonal y transformarla ecuación lineal en forma diagonal superior unitaria,facilitando resolverla recursivamente.É La eliminación gaussiana se implementa en una computadora
usando una estrategia eficiente de cálculo y almacenamientollamada factorización L-U.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 8
Algoritmo L-U
É El algoritmo L-U tiene dos fases.É En la fase de factorización, se usa eliminación gaussiana para
factorizar la matriz A como el producto
A = LU
de una matriz triangular inferior (posiblemente con filaspermutadas) L y una matriz triangular superior U .É Una matriz triangular inferior con filas permutadas es una
matriz triangualr inferior a las que se le han reacomodado susfilas.É Toda matriz cuadrada no singular puede factorizarse de esta
manera.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 9
É En la fase de solución del algoritmo L-U, la ecuación linealfactorizada
Ax = (LU)x = L(Ux) = b
se resuelve primero resolviendo
Ly = b
recursivamente para y y luego resolviendo
Ux = y
recursivamente para x .
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 10
Ejemplo 2:Algoritmo L-U
É Consideremos la ecuación lineal Ax = b donde
A =
−3 2 3−3 2 1
3 0 0
y b =
108−3
.É Entonces A = LU , donde
L =
1 0 01 0 1−1 1 0
y U =
−3 2 30 2 30 0 −2
.É Resolviendo Ly = b y luego Ux = y resulta en
y =
107−2
y x =
−121
.©Randall Romero Aguilar, PhD SP-6534 / 2020.I 11
£Por qué usar eliminación gaussiana para resolverecuaciones lineales?
É La eliminación gaussiana es el método conocido más eficienteresolver ecuaciones lineales de dimensión n generales Ax = b.É Para n grande, eliminación gaussiana requiere cerca de
n3/3+ n2 operaciones de multiplicación/división.É Calcular A−1b explícitamente requiere cerca de n3 + n2
operaciones.É La regla de Cramer requiere (n+ 1)! operaciones.É Para n = 10, el número de operaciones es
Gaussian Elimination 430Explicit Inverse 1 100Cramer’s Rule 40 000 000
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 12
É La función solve de numpy.linalg usa eliminación gaussianapara resolver ecuaciones lineales.É Por ejemplo, para resolver la ecuación lineal del ejemplo
anterior, ejecute el códigoimport numpy as npfrom numpy.linalg import solve
A = np.array([[1, 1, 2],[3, 4, 8],[2, 1, 1]])
b = np.array([5, 18, 6])x = solve(A, b)print(x)
É Esto debe resultar en[ 2. 1. 1.]
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 13
Factorización de Cholesky
É Si A es simétrica y definida positiva, entonces Ax = b puederesolverse con una variante de la eliminación gaussianallamada factorización de Cholesky.É En este caso, una matriz simétrica definida positiva A se
descompone de manera única en el producto
A = U ′U
de una matriz triangular superior U y su transpuesta.É A U se le llama el factor de Cholesky o la raíz cuadrada de A.É La descomposición de Cholesky requiere solo la mitad de las
operaciones de la eliminación gaussiana y no requiere pivoteo.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 14
3. Error de redondeo
Error de redondeo
É Las computadoras tienen almacenamiento finito y solo puedenrepresentar de manera exacta una cantidad finita de números.É Por ello, la aritmética exacta y la aritmética de computadoras
no siempre coinciden.É Si uno intenta calcular un número que no puede representarse
de manera exacta en una computadora, el resultado seráredondeado al número representable más cercano,introduciendo un error de redondeo.É En particular, cuando se suman o restan dos números con
magnitudes extremamente diferentes, el número máspequeño es efectivamente ignorado.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 15
Ejemplo 3:Error de redondeo
É En aritmética exacta
(ε+ 1)− 1 = ε+(1− 1) = ε
É Sin embargo, en aritmética de computadora con Pythone = 1e-20x = (e + 1) - 1y = e + (1 - 1)
É ... da por resultadox = 0.0y = 1e-20
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 16
4. Pivoteo
É Los errores de redondeo pueden causar problemas cuando seresuelven ecuaciones lineales.É Consideremos la ecuación lineal�
ε 11 1
��x1x2
�=
�12
�con ε= 10−17.É Podemos verificar fácilmente que la solución exacta es
x1 = 11−ε , la cual es ligeramente mayor que 1
x2 = 1−2ε1−ε , la cual es ligeramente menor que 1
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 17
É Para resolver la ecuación lineal por eliminación gaussiana,sumemos −1/ε veces la primer fila a la segunda�
ε 10 1− 1/ε
��x1x2
�=
�1
2− 1/ε
�É luego resolvemos recursivamente
x2 = 2−1/ε1−1/ε
x1 = 1−x2ε
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 18
É Si uno calcula x1 y x2 de esta manera en Python,e = 1e-17x2 = (2-1/e) / (1-1/e)x1 = (1-x2)/e
las operaciones resultan enx2 = 1.0x1 = 0.0
É El valor calculado de x1 es terriblemente inexacto.É £Qué pasó?
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 19
É En el primer paso de eliminiación gaussiana, calculamos
x2 =2− 1/ε1− 1/ε
É Pero, como 1/ε es muy grande comparado a 1 o 2, seintrodujo error de redondeo, y en realidad lo que calculó lacomputadora fue
x2 =−1/ε−1/ε
lo cual evalúa exactamente a 1.É Luego calculamos
x1 =1− x2ε
lo cual evalúa exactamente a 0.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 20
É Ahora resolvamos la ecuación lineal nuevamente poreliminación gaussiana, pero primero intercambiemos las dosfilas, lo que en teoría no afectará la solución�
1 1ε 1
��x1x2
�=
�21
�É Ahora sumamos −ε veces la primera fila a la segunda�
1 10 1− ε��
x1x2
�=
�2
1− 2ε
�É y resolvemos recursivamente
x2 = 1−2ε1−ε
x1 = 2− x2
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 21
É Si uno calcula x1 y x2 de esta manera en Pythone = 1e-17x2 = (1-2*e) / (1-e)x1 = 2 - x2
las operaciones dan por resultadox2 = 1.0x1 = 1.0
É Los valores calculados dex1 y x2 están un poco desviados, peroson mucho más precisos que los primeros valores quecalculamos.É £Por qué mejoró la precisión del resultado calculado cuando
intercambiamos las dos filas?
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 22
É La inexactitud de la primera solución se debió al error deredondeo causado por la magnitud tan pequeña del elementodiagonal ε.É Al primero intercambiar las dos filas, trajimos un número de
mayor magnitud a la diagonal, lo cual redujo el error deredondeo en cálculos subsiguientes.É Intercambiar filas para aumentar la magnitud del elemnto
diagonal lo más posible se conoce como pivoteo.É El pivoteo mejora sustancialmente la exactitud computacional
de la eliminación gaussiana.É Todos los buenos solvers lineales, incluído la función
numpy.linalg.solve, usan pivoteo.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 23
5. Mal condicionamiento
Mal condicionamiento
É Consideremos la ecuación lineal de n dimensiones Ax = b.É Una perturbación en b inducirá un cambio en la solución x .
A(x +δx) = b +δb
É Si perturbaciones pequeñas en b provocan cambiosdesproporcionadamente grandes en x , decimos que A es malcondicionada o casi singular.É Si A es mal condicionada, errores inevitables de redondeo en
la representación de b en una computadora harán imposiblecalcular una solución precisa de Ax = b.É El mal condicionamiento es endémico a la matriz A y no
puede corregirse con trucos simples como el pivoteo.É La única manera de lidiar con mal condicionamiento es
evitarlo.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 24
Mal condicionamiento y número de condición
É El mal condicionamiento se mide con el número de condiciónde A.É El número de condición es el cambio porcentual máximo en el
tamaño de x por cambio de una unidad porcentual en eltamaño de b.É Técnicamente, el número de condición es el ratio del mayor al
menor valor singular de A.É Regla general: El valor calculado de x piede un dígito
significativo por cada potencia de 10 del número de condiciónde A.É El número de condición siembre es mayor o igual a 1.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 25
Una matriz mal condicionada: Vandermonde
É Consideremos las notorias matrices Vandermonde.É La matriz Vandermonde n× n tiene elemento típico
Aij = in−j
É Por ejemplo, para n = 4
A =
1 1 1 18 4 2 1
27 9 3 164 16 4 1
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 26
É Resolvamos la ecuación lineal
Ax = b
donde A es la matriz Vandermonde n× n y b la suma de lascolumnas de A, es decir, el vector n× 1 con elemento típico
bi =n∑
j=1Aij
É Por construcción, la solución exacta de esta ecuación lineal esun vector n× 1 vector x de unos.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 27
É Para resolver la ecuación lineal y evaluar su precisión,definimos la función errorVander
def errorVander(n):A = np.vander(np.arange(1,n+1))b = A @ np.ones(n)x = solve(A, b)error np.max(abs(x-1))return x, error
É Aquí, calculamos la matriz A usando la función especial denumpy vander y calculamos el error máximo entre loselementos de la solución calculada.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 28
É Con n = 4, ejecutando esta función se obtiene, comoesperamos,
x = [ 1. 1. 1. 1.]error = 0.0
É No obstante, con n = 64, ejecutando el código se obtieneLinAlgError: Singular matrix
É Esta advertencia indica que A es mal condicionada.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 29
20 40 60 80 100n
100
1050
10100
10150
10200 Condition Number
||I V 1V||
Figura 2.1: Mal condicionamiento de las matrices Vandermonde
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 30
6. Matrices dispersas
Matrices dispersas
É Una matriz dispersa es una matriz que consistemayoritariamente de ceros.É Resolver Ax = b cuando A es dispersa usando elminación de
Gauss consistirá mayoritariamente en operaciones trivialespero costosas: multiplicaciones y sumas con ceros.É La velocidad de ejecución puede aumentarse drásticamente
evitando estas operaciones inútiles.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 31
É Scipy tiene funciones especiales para almacenar y operareficientemente con matrices dispersas.É En particular, en scipy.sparse, S = csr_matrix(A) crea una
versión de la matriz A, llamada aquí S, almacenada en formatode matriz dispersa, en la cual sólo los elementos distintos decero y sus índices son almacenados explícitamente.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 32
É Ejecutemos el códigoimport numpy as npimport scipy as sp
A = array([[0,0,0,5],[0,2,0,0],[0,0,0,0],[0,0,4,0]])
S = sp.sparse.csr_matrix(A)print(S)
É Esto debe dar por resultado(0, 3) 5(1, 1) 2(3, 2) 4
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 33
É Almacenar una matriz dispersa en formato disperso requieresolo una fracción del espacio requerido para almacenarlo enformato denso.É Si A solo tiene q por ciento de valores distinto de cero, el
espacio requerido para guardar S será 3q por ciento delespacio requerido para guardar A.É Por ejemplo, una matriz tridiagonal 1000× 1000 requerirá 1
millón de unidades de memoria en formato denso, pero solo8 994 unidades en formato disperso, un ahorro de 99%.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 34
É La función de scipy.sparse.linalg spsolve aplica eliminaciónde Gauss para aprovechar la dispersión de matrices dispersas.É En particular, si S = csr_matrix(A) es grande pero dispersa,
estas dos líneasx = solve(A, b)x = spsolve(S,b)
producirán el mismo resultado, pero la última expresión seejecutará más rápido por evitar operaciones innecesarias conceros.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 35
Ejemplo 4:Resolviendo un sistema deecuaciones dispersas
Consideremos el problema de resolver Ax = b cuando A es unamatriz tridiagonal 1000× 1000.
T = 1000A = np.eye(T) - 2*np.eye(T,k=1) + 3*np.eye(T,k=-1)S = csr_matrix(A)b = A.sum(axis=1)
En una sesión interactiva, si uno escribe %timeit solve(A,b)obtendrá (dependiendo de la velocidad de su computadora)
21.1 ms ś 734 ţs per loop (mean ś std. dev. of 7 runs, 10 loops each)
comparado con %timeit spsolve(S,b)513 ţs ś 8.25 ţs per loop (mean ś std. dev. of 7 runs, 1000 loops each)
Es decir, resolver el sistema disperso tardó 2.43% del tiemporequerido para hacerlo con una matriz densa.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 36
References I
Miranda, Mario J. y Paul L. Fackler (2002). Applied ComputationalEconomics and Finance. MIT Press. isbn: 0-262-13420-9.
Romero-Aguilar, Randall (2016). CompEcon-Python. url:http://randall-romero.com/code/compecon/.
©Randall Romero Aguilar, PhD SP-6534 / 2020.I 37