“I think
there is a world market for maybe five computers” - Thomas John
Watson (1943)
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.
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:
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.