Randall Romero Aguilar, PhD

49
Tema 2 Ecuaciones lineales Randall Romero Aguilar, PhD Universidad de Costa Rica SP6534 - Economía Computacional I Semestre 2020 Última actualización: 10 de marzo de 2020

Transcript of Randall Romero Aguilar, PhD

Page 1: 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

Page 2: Randall Romero Aguilar, PhD

Tabla de contenidos

1. Introducción

2. Eliminación gaussiana

3. Error de redondeo

4. Pivoteo

5. Mal condicionamiento

6. Matrices dispersas

Page 3: Randall Romero Aguilar, PhD

1. Introducción

Page 4: Randall Romero Aguilar, PhD

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

Page 5: Randall Romero Aguilar, PhD

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

Page 6: Randall Romero Aguilar, PhD

É 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

Page 7: Randall Romero Aguilar, PhD

2. Eliminación gaussiana

Page 8: Randall Romero Aguilar, PhD

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

Page 9: Randall Romero Aguilar, PhD

Ejemplo 1:Eliminación gaussiana

Page 10: Randall Romero Aguilar, PhD

É 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

Page 11: Randall Romero Aguilar, PhD

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

Page 12: Randall Romero Aguilar, PhD

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

Page 13: Randall Romero Aguilar, PhD

É 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

Page 14: Randall Romero Aguilar, PhD

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

Page 15: Randall Romero Aguilar, PhD

É 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

Page 16: Randall Romero Aguilar, PhD

Ejemplo 2:Algoritmo L-U

Page 17: Randall Romero Aguilar, PhD

É 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

Page 18: Randall Romero Aguilar, PhD

£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

Page 19: Randall Romero Aguilar, PhD

É 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

Page 20: Randall Romero Aguilar, PhD

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

Page 21: Randall Romero Aguilar, PhD

3. Error de redondeo

Page 22: Randall Romero Aguilar, PhD

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

Page 23: Randall Romero Aguilar, PhD

Ejemplo 3:Error de redondeo

Page 24: Randall Romero Aguilar, PhD

É 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

Page 25: Randall Romero Aguilar, PhD

4. Pivoteo

Page 26: Randall Romero Aguilar, PhD

É 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

Page 27: Randall Romero Aguilar, PhD

É 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

Page 28: Randall Romero Aguilar, PhD

É 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

Page 29: Randall Romero Aguilar, PhD

É 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

Page 30: Randall Romero Aguilar, PhD

É 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

Page 31: Randall Romero Aguilar, PhD

É 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

Page 32: Randall Romero Aguilar, PhD

É 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

Page 33: Randall Romero Aguilar, PhD

5. Mal condicionamiento

Page 34: Randall Romero Aguilar, PhD

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

Page 35: Randall Romero Aguilar, PhD

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

Page 36: Randall Romero Aguilar, PhD

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

Page 37: Randall Romero Aguilar, PhD

É 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

Page 38: Randall Romero Aguilar, PhD

É 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

Page 39: Randall Romero Aguilar, PhD

É 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

Page 40: Randall Romero Aguilar, PhD

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

Page 41: Randall Romero Aguilar, PhD

6. Matrices dispersas

Page 42: Randall Romero Aguilar, PhD

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

Page 43: Randall Romero Aguilar, PhD

É 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

Page 44: Randall Romero Aguilar, PhD

É 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

Page 45: Randall Romero Aguilar, PhD

É 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

Page 46: Randall Romero Aguilar, PhD

É 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

Page 47: Randall Romero Aguilar, PhD

Ejemplo 4:Resolviendo un sistema deecuaciones dispersas

Page 48: Randall Romero Aguilar, PhD

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

Page 49: Randall Romero Aguilar, PhD

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