jueves, 31 de mayo de 2012

Modelos Dinámicos con Mathematica 10.0 (actualizado)

“I think there is a world market for maybe five computers” - Thomas John Watson (1943)


La investigación de la dinámica económica, es decir de la relación intertemporal entre las variables consideradas relevantes dentro de un fenómeno económico, es una parte fundamental de la formación del economista moderno.

Gran parte de las mas refinadas técnicas de la Teoría de Sistemas Dinámicos y de la Teoría del Control han pasado a formar parte de la “caja de herramientas” del economista actual. La sofisticación de estas técnicas requiere de un serio  esfuerzo de aprendizaje, lo que no siempre posibilita que la formación abarque con el énfasis suficiente el asunto de la implementación de estas técnicas a problemas concretos de modelación. 

A mi modo de ver, gran parte de este problema es atribuible a que aun estando familiarizados con los fundamentos matemáticos, la mayor parte de los estudiantes carece específicamente del conocimiento apropiado de un lenguaje de programación o de un sistema de computación numérica y/o algebraica que haga factible realizar el número de ensayos que precisa explorar el comportamiento dinámico del modelo que se esta estudiando.

Y es que la dificultad esencial de los ensayos se encuentra en el abultado número de cálculos que requiere llevarlos a cabo. Por esta razón es indispensable traducir las relaciones matemáticas provenientes de los modelos dinámicos en instrucciones eficientes para el computador. En este blog mostraremos en sucesivos ejemplos como realizar esta labor principalmente mediante Wolfram Mathematica 10.0 para Windows (http://www.wolfram.com/mathematica/). Este producto es un poderoso sistema de computación algebraica y numérica que puede convertirse en una valiosísima herramienta de modelación, simulación y análisis.

Las principales virtud de Mathematica para el economista son, de un lado, su lenguaje funcional coherente y unificado que permite programar los cálculos siguiendo una lógica y una sintaxis muy cercana a la tradicional en las matemáticas, y de otro lado, su capacidad excepcional para realizar un amplio género de cálculos algebraicos que pueden contener símbolos además de números. Estas dos cualidades hacen posible escribir y computar modelos dinámicos de elevada complejidad. Las actuales capacidades de la versión 10.0, entre las que se encuentra la ejecución multi-nucleo y en grilla, librerías optimizadas para CPU específicos, procesamiento en 64 bits, vinculación a compiladores de C y aceleración mediante unidades de procesamiento gráfico (soporte GPU para CUDA y OpenCL) completan el potencial de Mathematica para llevar a cabo exigentes rutinas de cálculo algebraico y numérico asi como de generación de gráficos. 
   
Analicemos brevemente ahora el conocido "modelo de la telaraña" (en tiempo discreto). En este modelo suponemos que en el mercado de un bien las cantidades demandas y ofertadas en el periodo t dependen linealmente del precio del mismo periodo, pero dado que las empresas reaccionan con un cierto retardo a los cambios en el precio, la cantidad ofertada es también influenciada linealmente por el precio del periodo anterior. Tenemos entonces analíticamente las ecuaciones:

Qd[t] = a + b p[t]

Qs[t] = m + n p[t] + k p[t-1]

donde a, b, m, n y k tienen los signos convenientes. 

Puesto que el mercado se mantiene equilibrado para todo t entonces Qd[t] = Qs[t]. De aquí se obtiene mediante un simple manipuleo algebraico la ecuación en diferencias lineal de primer orden que describe la dinámica discreta del precio de equilibrio:

p[t+1] = - ((a - m) / (b - n)) – (k / (b - n)) p[t]

Teniendo información del precio inicial p[0] y estando determinados los valores de los parámetros de la ecuación anterior, es plenamente factible resolver dicha ecuación mediante la función RSolve de Mathematica. Sin embargo aquí solo exploraremos gráficamente el comportamiento del precio y cantidad de equilibrio, para lo cual solo requerimos calcular iterativamente la secuencia de precios y cantidades para T periodos. Esta tarea la realizamos aplicando primero en forma directa la función RecurrenceTable a la ecuación en diferencias presentada. Esto significa ejecutar la expresión:

RecurrenceTable[{p[t+1]==-((a-m)/(b-n))-(k/(b-n))*p[t], p[0]==po}, p, {t,0,T}]

donde “po” es el valor del precio inicial. 

Para experimentar con la dinámica del precio y cantidad de equilibrio requerimos poder iterar considerando distintos parámetros y precios iniciales. La forma mas eficiente de hacerlo mediante Mathematica es emplear la función Manipulate, la cual posibilita “manipular” el cálculo de una expresión mediante controles como sliders y botones que modifican fácilmente parámetros específicos del cálculo. En nuestro caso, aplicaremos la función Manipulate para manipular las gráficas de las trayectorias del precio y cantidad de equilibrio mediante el control de los parámetros de la ecuación (a, b, m, n, k), del precio inicial (p[0]) y del numero de periodos a calcular (T). Implementamos entonces el siguiente código: 

Manipulate[

GraphicsColumn[{ListPlot[{Range[0,T],
RecurrenceTable[{p[t+1]==-((m-a)/(n-b))-k/(n-b)*p[t],p[0]==po},
p,{t,0,T}]}
//Transpose,
Axes->False,
PlotTheme->"Scientific",
PlotLabel->"Precio de Equilibrio",
PlotRange->All,
Filling->Bottom,
FillingStyle->Directive[Magenta,Dashed],
PlotMarkers->{Automatic,Tiny},
Frame->True,
FrameTicks->{{{(-a+m)/(b-n-k),po},None},{Automatic,None}},
GridLines->{None,{(-a+m)/(b-n-k)}},
GridLinesStyle->Directive[Red,Dashed]],

ListPlot[{Range[0,T],
a+b*RecurrenceTable[{p[t+1]==-((m-a)/(n-b))-k/(n-b)*p[t],p[0]==po},
p,{t,0,T}]}
//Transpose,
Axes->False,
PlotLabel->"Cantidad de Equilibrio",
PlotTheme->"Scientific",
PlotRange->All,
Filling->Bottom,
FillingStyle->Directive[Magenta,Dashed],
PlotMarkers->{Automatic,Tiny},
Frame->True,
FrameTicks->{{{a+(b*(-a+m))/(b-n-k),a+b*po},None},{Automatic,None}},
GridLines->{None,{a+(b*(-a+m))/(b-n-k)}},
GridLinesStyle->Directive[Red,Dashed]]}],

Style["DINAMICA DE EQUILIBRIO",Bold],"",
{{po,10,"Precio inicial p[0]"},5,50,Appearance->"Labeled"},
Delimiter,
Style["Modelo:",Bold],"",
"Demanda:    Qd[t] = a + b p[t]","",
{{a,270},100,300,Appearance->"Labeled"},
{{b,-.8},-3,-.1,Appearance->"Labeled"},
"Oferta:    Qs[t] = m + n p[t] + k p[t-1]","",
{{m,1},-3,3,Appearance->"Labeled"},
{{n,2},0,3,Appearance->"Labeled"},
{{k,1.5},-.3,3,Appearance->"Labeled"},
Delimiter,
{{T,10,"Tiempo"},10,50,1,Appearance->"Labeled"}
]


Aunque puede lucir complicado, la codificación en Mathematica es sumamente lógica y simple. Invito al lector a perseverar para comprender la estructura del código anterior. Al ejecutarse sobre un libro de notas de Mathematica, lo que obtenemos es un manipulador que luce como sigue:


Modificando mediante los controles slider, el precio inicial, los parámetros de las ecuaciones de demanda y oferta (que son parámetros de la ecuación en diferencias del precio) y el numero de periodos a calcular, puede visualizarse con total precisión cuales serán los cambios en las trayectorias del precio y cantidad de equilibrio del mercado. En el siguiente panel se muestra una trayectoria divergente oscilatoria obtenida mediante la modificación de los parámetros. 


Se ha mostrado de este modo, como la exploración de la dinámica de la telaraña puede realizarse y analizarse de una forma simple con el paquete Mathematica.
Si tienen Mathematica 10.0 instalado en su computador, copien y luego peguen el código sobre un libro de notas, ejecútenlo, experimenten y luego traten de modificarlo según su interés. Espero que esta ligera demostración les anime a emprender sus propios proyectos para mejorar su labor y enriquecer su aprendizaje.