Saltar al contenido principal
LibreTexts Español

4.3: Simulación de modelos de tiempo discreto con una variable

  • Page ID
    115695
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Ahora es el momento de hacer nuestro primer ejercicio de simulación por computadora de modelos de tiempo discreto en Python. Comencemos con este modelo de ecuación de diferencia lineal muy simple de una variable escalar\(x\):

    \[x_{t}=ax_{t-1}\label{(4.12)} \]

    Aquí,\(a\) es un parámetro de modelo que especifica la relación entre el estado actual y el siguiente estado. Nuestro objetivo es conocer qué tipo de comportamiento mostrará este modelo a través de la simulación por computadora.

    Cuando se quiere realizar una simulación por computadora de cualquier tipo, hay al menos tres cosas esenciales que necesitará programar, de la siguiente manera:

    Tres componentes esenciales de la simulación por computadora

    Inicializar. Deberá configurar los valores iniciales para todas las variables de estado del sistema.
    Observar. Tendrás que definir cómo vas a monitorear el estado del sistema. Esto podría hacerse simplemente imprimiendo algunas variables, recopilando mediciones en una estructura de lista o visualizando el estado del sistema.
    Actualización. Deberá definir cómo va a actualizar los valores de esas variables de estado en cada paso de tiempo. Esta parte se definirá como una función, y se ejecutará repetidamente.

    Seguiremos utilizando esta arquitectura de tres partes de códigos de simulación a lo largo de este libro de texto. Todos los códigos de muestra están disponibles en la página web del libro de texto en http://bingweb.binghamton.edu/~sayama/textbook/, directamente enlazados desde cada ejemplo de Código si estás leyendo esto electrónicamente.

    Para escribir la parte de inicialización, deberás decidir cómo vas a representar el estado del sistema en tu código de computadora. Esto se convertirá en una tarea desafiante cuando trabajemos en simulaciones de sistemas más complejos, pero en este punto, esto es bastante fácil. Como solo tenemos una variable, podemos decidir usar un símbolo\(x\) para representar el estado del sistema. Así que aquí hay un código de muestra para la inicialización:

    código 4.1.png

    En este ejemplo, definimos la inicialización como una función Python que inicializa la variable global\(x\) desde dentro de la propia función. Es por ello que tenemos que declarar que\(x\) es global al principio. Si bien tal uso de variables globales no es bienvenido en la informática convencional y la ingeniería de software, he descubierto que en realidad hace que los códigos de simulación sean mucho más fáciles de entender y escribir para la mayoría de las personas que no tienen mucha experiencia en programación informática. Por lo tanto, frecuentemente utilizamos variables globales a lo largo de este libro de texto.

    A continuación, necesitamos codificar la parte de observación. Hay muchas formas diferentes de realizar un seguimiento de las variables de estado en una simulación por computadora, pero aquí usemos un enfoque muy simple para crear una lista de series de tiempo. Esto se puede hacer inicializando primero la lista con el estado inicial del sistema, y luego agregando el estado actual a la lista cada vez que se haga la observación. Podemos definir la parte de observación como una función para que sea más fácil de leer. Aquí está el código actualizado:

    código 4.2.png

    Por último, necesitamos programar la parte de actualización. Aquí es donde ocurre la simulación real. Esto se puede implementar en otra función:

    código 4.3.png

    Tenga en cuenta que la última línea sobrescribe directamente el contenido del símbolo\(x\). No hay distinción entre\(x_{t−1}\) y\(x_{t}\), pero esto está bien, porque los valores pasados de\(x\) se almacenan en la lista de resultados en la función observe. Ahora tenemos implementados los tres componentes cruciales. También necesitamos agregar ajustes de parámetros al principio, y el bucle iterativo de actualización al final. Aquí, vamos a dejar\(a = 1.1\) que el valor de\(x\) aumente en un 10% en cada paso de tiempo. El código de simulación completado se ve así:

    código 4.4.png

    Aquí simulamos el comportamiento del sistema durante 30 pasos de tiempo. Intenta ejecutar este código en tu Python y asegúrate de no obtener ningún error. Si es así, ¡felicidades! Acabas de completar la primera simulación por computadora de un sistema dinámico. Por supuesto, este código no produce ninguna salida, así que no puedes estar seguro de si la simulación se ejecutó correctamente o no. Una manera fácil de ver el resultado es agregar la siguiente línea al final del código:

    código 4.5 2.png

    Si vuelves a ejecutar el código, probablemente verás algo como esto:

    Código 4.6.png

    Vemos que el valor de x ciertamente creció. Pero solo mirar esos números no nos dará mucha información sobre cómo creció. Deberíamos visualizar estos números para observar el proceso de crecimiento de una manera más intuitiva. Para crear una gráfica visual, necesitaremos usar la biblioteca matplotlib 1. Aquí utilizamos su entorno pylab incluido en matplotlib. Pylab proporciona un entorno de trabajo similar a Matlab al agrupar las funciones de trazado de matplotlib junto con una serie de funciones matemáticas/computacionales de uso frecuente (por ejemplo, funciones trigonométricas, generadores de números aleatorios, etc.). Para usar pylab, puedes agregar la siguiente línea al inicio de tu código 2:

    código 4.7.png
    Y luego puedes agregar las siguientes líneas al final de tu código:

    código 4.8.png

    El código completo en su conjunto es el siguiente (puede descargar el código Python real haciendo clic en el nombre del código en este libro de texto):

    código 4.9.png

    Ejecuta este código y deberías obtener una nueva ventana que se vea como la Fig. 4.3.1. Si no, revisa tu código cuidadosamente y corrige cualquier error. Una vez que obtienes una gráfica visualizada con éxito, puedes ver claramente un proceso de crecimiento exponencial en ella. En efecto, la Ecuación\ ref {(4.12)} es un modelo matemático típico de crecimiento exponencial o decaimiento exponencial. Puede obtener varios comportamientos distintos variando el valor de\(a\).

    Fig. 4.1.PNG
    Figura\(\PageIndex{1}\): Salida visual de Código 4.9.
    Ejercicio\(\PageIndex{1}\)

    Realizar simulaciones de este modelo para diversos valores del parámetro a para ver qué tipo de comportamientos son posibles en este modelo y cómo el valor de a determina el comportamiento resultante.

    Para su información, hay una serie de opciones que puede especificar en la función de trazado, como agregar un título, etiquetar ejes, cambiar de color, cambiar rangos de trazado, etc. Además, puede manipular el resultado del trazado de forma interactiva utilizando los iconos ubicados en la parte inferior de la ventana de trazado. Consulte el sitio web de matplotlib (http://matplotlib.org/) para obtener más información sobre esas características adicionales usted mismo. En la visualización anterior, el eje horizontal se rellena automáticamente con enteros comenzando con 0. Pero si quieres dar tus propios valores de tiempo (por ejemplo, a intervalos de 0.1), también puedes simular el progreso del tiempo, de la siguiente manera (las partes revisadas están marcadas con ###):

    código 4.10.png

    Ejercicio\(\PageIndex{2}\)

    Implementar un código de simulación de la siguiente ecuación de diferencia:

    \[x_{t} = ax_{t-1} +b, x_{0}=1\label{(4.13)} \]

    Esta ecuación sigue siendo lineal, pero ahora tiene un término constante además de\(ax_{t−1}\). Algunos ejemplos del mundo real que se pueden modelar en esta ecuación incluyen el crecimiento de la población de peces con remociones constantes debido a la pesca, y el crecimiento de los saldos de las tarjetas de crédito con pagos mensuales constantes (ambos con negativos\(b\)). Cambiar los valores de\(a\) y\(b\), y ver si los comportamientos del sistema son los mismos que los del modelo simple de crecimiento/decaimiento exponencial

    1 Ya está incluida en Anaconda y Enthought Canopy. Si está utilizando una distribución diferente de Python, matplotlib está disponible gratuitamente en http://matplotlib.org/.

    2 Otra forma de importar pylab es escribir “import pylab” en su lugar, que es recomendado por personas más conocedoras de la programación. Si haces esto, sin embargo, las funciones de pylab tienen que tener el prefijo pylab agregado a ellas, como pylab.plot (result). Para simplificar, utilizamos “from pylab import *” a lo largo de este libro de texto


    This page titled 4.3: Simulación de modelos de tiempo discreto con una variable is shared under a CC BY-NC-SA 3.0 license and was authored, remixed, and/or curated by Hiroki Sayama (OpenSUNY) via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.