Randall Romero Aguilar, PhD

Post on 11-Jun-2022

5 views 0 download

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