diff --git a/Explicaciones_cod.ipynb b/Explicaciones_cod.ipynb
new file mode 100644
index 0000000000000000000000000000000000000000..f2d4c3da37e1f9b955f068b72049bf993f682dd6
--- /dev/null
+++ b/Explicaciones_cod.ipynb
@@ -0,0 +1,660 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Monte Carlo cinético para un sistema de reacción-difusión unidimensional\n",
+    "\n",
+    "### Proyecto de Datos\n",
+    "\n",
+    "**Presentado por:** Sasiri Juliana Vargas Urbano (@vargass)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import random as rm\n",
+    "import numpy as np\n",
+    "import matplotlib\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "from matplotlib.animation import FuncAnimation   #Para las animaciones\n",
+    "import moviepy.editor as mp  #Para transformar el gif en mp4\n",
+    "from IPython.display import Video  #Para reproducir el video mp4 notebook"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Algunas cantidades y definiciones que se utilizarán para el código son:"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Para la discretización**<br>\n",
+    "$\\Delta x = 1$ : Paso espacial <br>\n",
+    "$\\Delta t = 1$ : Paso temporal\n",
+    "\n",
+    "**Constante de reacción**<br>\n",
+    "K : _La define el usuario_\n",
+    "\n",
+    "**Tasa de reacción**<br>\n",
+    "$\\beta= K/\\Delta x$\n",
+    "\n",
+    "**Coeficiente de difusión**<br>\n",
+    "D : _La define el usuario_\n",
+    "\n",
+    "**Tasa de salto**<br>\n",
+    "$\\lambda = D/\\Delta x^2$\n",
+    "\n",
+    "**Probabilidad de salto**<br>\n",
+    "$P_S = \\lambda \\: \\Delta t$\n",
+    "\n",
+    "**Corriente de incersion**<br>\n",
+    "j : _La define el usuario_\n",
+    "\n",
+    "**Probabilidad de incersion**<br>\n",
+    "$P_J= j$\n",
+    "\n",
+    "**Probabilidad de reacción**<br>\n",
+    "$P_R= \\beta \\Delta t$"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Densidad local (discreta):** (Aplica tanto para partículas A como partículas B)<br>\n",
+    "$\\rho_i (t)$: _Es lo que va a evolucionar en la simulación_\n",
+    "\n",
+    "**Densidad local (continua):** (Aplica tanto para partículas A como partículas B)<br>\n",
+    "$\\rho (x) = <\\rho_i (t)>$<br>\n",
+    "Donde < > representa el promedio sobre configuraciones y $\\rho_i (t)$ es el número de partículas en el sitio i.\n",
+    "\n",
+    "**Posición de la partícula A ubicada más a la derecha**<br>\n",
+    "$RMA$ : _Se determina en la simulación_\n",
+    "\n",
+    "**Posición de la partícula B ubicada más a la izquierda**<br>\n",
+    "$LMB$ : _Se determina en la simulación_\n",
+    "\n",
+    "**Distribución de espaciamientos (discreta):**<br>\n",
+    "$P_i(t) = \\left\\lbrace\n",
+    "\\begin{array}{ll}\n",
+    " 1 & {si \\; en \\; t} \\:|RMA-LMB|= i \\\\\n",
+    "0  & {de \\; otra \\; forma} \n",
+    "\\end{array}\n",
+    "\\right.$\n",
+    "\n",
+    "**Distribución de espaciamientos (continua):**<br>\n",
+    "$P(x,t)$ = < $P_i(t)$ > / $\\Delta x$ <br>\n",
+    "Donde < > representa el promedio sobre configuraciones"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Código (Escritura de archivos y gráficas)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Para 1 Experimento:**<br>\n",
+    "Para la escritura del código se utilizan 2 funciones principales:<br>\n",
+    "- *Dinamica* : Contiene el código que evoluciona el sistema en un paso de tiempo. Los parámetros de esta función son:\n",
+    "\n",
+    "    - vec : arreglo a evolucionar\n",
+    "    - l : 1/2 de la longitud del arreglo (físicamente 1/2 de la longitud del sistema)\n",
+    "    - Pr : Probabilidad de reaccion impuesta por el usuario\n",
+    "    - Pj : Probabilidad de incersion impuesta por el usuario\n",
+    "    - Ps : Probabilidad de salto impuesta por el usuario\n",
+    "\n",
+    "- *ciclos* : Realiza la función dinámica en N pasos de tiempo. Los parámetros de esta función son:\n",
+    "    - c_ini : condición inicial\n",
+    "    - l : Longitud del arreglo (físicamente la longitud del sistema)\n",
+    "    - Pr : Probabilidad de reaccion impuesta por el usuario\n",
+    "    - Pj : Probabilidad de incersion impuesta por el usuario\n",
+    "    - Ps : Probabilidad de salto impuesta por el usuario\n",
+    "    - time :tiempo de la simulación\n",
+    "\n",
+    "\n",
+    "**Funciones adicionales:**<br>\n",
+    "También se hace uso de funciones adicionales de utilidad:\n",
+    "\n",
+    "- *P_i* : Definición de la distribución de espaciamiento discreta para una distancia i<br>\n",
+    "    - r : Para insertar la variable RMA\n",
+    "    - l : Para insertar la variable LMB\n",
+    "    - i : distancia a evaluar\n",
+    "    \n",
+    "- *P_i_xt* : Distribución de espaciamiento discreta evaluando para 0<i<2L<br>\n",
+    "    - r_ : Para insertar la variable RMA\n",
+    "    - l_ : Para insertar la variable LMB\n",
+    "    - L_ : 1/2 Longitud del sistema\n",
+    "\n",
+    "- *concentracionA_B* : Separa el arreglo ingresado, obteniendo 2 arreglos, para almacenar separadamente la información de las partículas A y B\n",
+    "    - entrada : arreglo a separar\n",
+    "\n",
+    "\n",
+    "**Función total (M experimentos):**<br>\n",
+    "Finalmente, ya que se trata de un Monte Carlo, se deben hacer múltiples repeticiones del experimento. Para ello se hace uso de un ciclo for dentro de la función 'ANALISIS' (+).\n",
+    "\n",
+    "Los parámetros de esta función son (se igualan a valores por defecto):\n",
+    "\n",
+    "- L=5 : Longitud del sistema\n",
+    "- dx=1 : Espaciamiento espacial\n",
+    "- dt=1 : Espaciamiento temporal\n",
+    "- D=0.5 : Coeficiente de difusión (tiene información del salto de las partículas)\n",
+    "- j=1 : Corriente de incerción (tiene información sobre la incerción de partículas)\n",
+    "- K=1 : Constante de reacción (tiene información sobre la reacción de las partículas)\n",
+    "- tiempo=2000 : Tiempo de simulación (Se espera que este sea el tiempo para llegar al estado estacionario)\n",
+    "- rep=10 : Cantidad de repeticiones del experimento\n",
+    "- opcion='datos' : (ver abajo+)\n",
+    "- nombre = 'Data': 'Prefijo' que se le dará a los archivos que guardan la información de la simulación.\n",
+    "\n",
+    "\n",
+    "(+) La función ANALISIS tiene tres opciones: \n",
+    "- 'datos' : Crea 3 archivos en los que se tiene la información de la distribución de espacimiento, la información de las concentraciones de A y de B, después de hacer varias repeticiones del experimento. También presenta las gráficas de la distribución de espaciamientos y los perfiles de concentraciones de A y B.\n",
+    "\n",
+    "- 'dinamica' : Permite visualizar lo que ocurre en el sistema, imprimiendo el vector que representa el sistema en cada paso de tiempo.\n",
+    "\n",
+    "- 'estacionario' : Evalúa si el tiempo ingresado lleva al estado a su estado estacionario\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Funciones:**"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#------------\n",
+    "#  DINÁMICA\n",
+    "#------------\n",
+    "def Dinamica(vec, l, Pr, Pj, Ps):\n",
+    "\n",
+    "    #Vector que almacena las concentraciones de las partículas A y B\n",
+    "    concentracion=np.array(vec)\n",
+    "    #Vector que almacena la distribución de espaciamientos\n",
+    "    Pesp=np.zeros(len(concentracion)) \n",
+    "\n",
+    "    # Números aleatorios:\n",
+    "    #--------------------\n",
+    "\n",
+    "    #Se tienen 4 números aleatorios. 3 de ellos representan la posibilidad de tener o no,\n",
+    "    #reacción, incerción y salto. El restante es el sitio en el que ocurrirá la dinámica\n",
+    "\n",
+    "    Escogida  = rm.randint(0,2*l) #Num aleatorio que escoge el sitio de red para efectuar la dinpamica\n",
+    "    particula = concentracion[Escogida] #Tipo de partícula escogida\n",
+    "\n",
+    "    p_r = rm.uniform(0,1e7)/1e7 #Num aleatorio para la prob de reacción\n",
+    "    p_j = rm.uniform(0,1e7)/1e7 #Num aleatorio para la prob de incerción\n",
+    "    p_s = rm.uniform(0,1e7)/1e7 #Num aleatorio para la prob de salto\n",
+    "\n",
+    "\n",
+    "    # Saltos\n",
+    "    # -------\n",
+    "\n",
+    "    #Para los saltos se tiene en cuenta lo siguiente:\n",
+    "    #Si 0 < p_s < Ps -> ocurre un salto hacia la derecha\n",
+    "    #Si Ps < p_s < 2*Ps -> ocurre un salto hacia la izquierda\n",
+    "    #(Siempre y cuando el sitio al que saltará la partícula este vacío)\n",
+    "    #Esto se realiza para que podamos tener información tanto de la posibilidad de salto,\n",
+    "    #como de la posibilidad de no saltar\n",
+    "\n",
+    "    #Ejemplo: Si Ps=0.5, entonces:\n",
+    "    #Salto a la derecha  : 0 < p_s < 0.5  --> 50% de las veces \n",
+    "    #Salto a la izquierda: 0.5 < p_s < 1  --> 50% de las veces\n",
+    "    #No salta                             --> 0% de las veces\n",
+    "\n",
+    "    if p_s < 2*Ps:\n",
+    "\n",
+    "        #Salto general (Se pueden escoger todos los sitios, excepto los extremos)\n",
+    "        if all((Escogida != 0, Escogida != 2*l, concentracion[Escogida] != 0)):\n",
+    "            #Salto derecha\n",
+    "            if all((p_s < Ps, concentracion[Escogida + 1] == 0)):\n",
+    "                concentracion[Escogida + 1] = particula\n",
+    "                concentracion[Escogida] = 0\n",
+    "            #Salto izquierda\n",
+    "            elif all((Ps < p_s < 2*Ps, concentracion[Escogida - 1] == 0)):\n",
+    "                concentracion[Escogida - 1] = particula\n",
+    "                concentracion[Escogida] = 0\n",
+    "\n",
+    "        #Extremo izquierdo (dominio de la partícula A) \n",
+    "        elif Escogida == 0:\n",
+    "            #Incercion: Si p_j < Pj, entonces se efectúa la incerción\n",
+    "            if all((p_j < Pj, concentracion[Escogida] == 0)):\n",
+    "                concentracion[Escogida] = -1\n",
+    "            #Salto: Se considera que hay salto a la derecha\n",
+    "            elif all((p_s < Ps, concentracion[0] != 0, concentracion[1] == 0)):\n",
+    "                concentracion[1] = particula\n",
+    "                concentracion[0] = 0\n",
+    "\n",
+    "        #Extremo derecho (dominio de la partícula B)\n",
+    "        elif Escogida == 2*l:\n",
+    "            #Incersion: Si p_j < Pj, entonces se efectúa la incerción\n",
+    "            if all((p_j < Pj, concentracion[Escogida] == 0)):\n",
+    "                concentracion[Escogida] = 1\n",
+    "            #Salto: Se considera que hay salto a la izquierda\n",
+    "            elif all((p_s < Ps, concentracion[2*l] != 0, concentracion[2*l-1] == 0)):\n",
+    "                concentracion[2*l-1] = particula\n",
+    "                concentracion[2*l] = 0\n",
+    "\n",
+    "    # Reaccion\n",
+    "    #----------\n",
+    "\n",
+    "    #La reacción se efectúa si p_r < Pr y si la distancia entre rma y lmb es igual a 1 (si A y B son vecinos)\n",
+    "\n",
+    "    try: \n",
+    "    #El try y el except es puesto porque hay ocasiones en las que se tiene por ejemplo:\n",
+    "    #[-1,-1,-1,0,0,0]\n",
+    "    #Entonces en este caso no es posible encontrar un lmb\n",
+    "\n",
+    "        #rma\n",
+    "        where1=np.where(concentracion == -1) #devuelve una tupla\n",
+    "        rmav=where1[0] #Arreglo de las ubicaciones de las partículas A\n",
+    "        rma=rmav[-1]   #Partícula más a la derecha\n",
+    "\n",
+    "        #lmb\n",
+    "        where2=np.where(concentracion == 1) \n",
+    "        lmbv=where2[0] #Arreglo de las ubicaciones de las partículas B\n",
+    "        lmb=lmbv[0]    #Partícula más a la izquierda\n",
+    "\n",
+    "        if (p_r < Pr) and (abs(rma-lmb) == 1): #Las partículas se aniquilan\n",
+    "            concentracion[rma] = 0 \n",
+    "            concentracion[lmb] = 0\n",
+    "\n",
+    "        #Se encuentran los nuevos rma y lmb para encontrar la distr. de espaciamientos\n",
+    "        #rma\n",
+    "        where1=np.where(concentracion == -1)\n",
+    "        rmav=where1[0]\n",
+    "        rma=rmav[-1]\n",
+    "\n",
+    "        #lmb\n",
+    "        where2=np.where(concentracion == 1)\n",
+    "        lmbv=where2[0]\n",
+    "        lmb=lmbv[0]\n",
+    "\n",
+    "        #Función que devuelve un arreglo de la distribución de espaciamientos\n",
+    "        Pesp= P_i_xt(rma,lmb,l)\n",
+    "\n",
+    "    except:            \n",
+    "        pass\n",
+    "\n",
+    "    return concentracion, Pesp # Devuelve 2 arreglos"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "# ---------\n",
+    "#  CICLOS\n",
+    "# ---------\n",
+    "\n",
+    "#Repite la función 'Dinamica' una cantidad M de veces, determinada por 'time'\n",
+    "\n",
+    "def ciclos(c_ini, l, Pr, Pj, Ps, time):\n",
+    "\n",
+    "    resultado=np.copy(c_ini) # copia de la condición inicial\n",
+    "    salida_conc_A=np.zeros(len(resultado)) # arreglo de salida para la concentración de A\n",
+    "    salida_conc_B=np.zeros(len(resultado)) # arreglo de salida para la concentración de B\n",
+    "    salida_esp=np.zeros(len(resultado)) # arreglo de salida para la dist. de espaciamientos\n",
+    "\n",
+    "    for i in range(time+1):\n",
+    "        resultado, espaciamiento = Dinamica(resultado, l, Pr, Pj, Ps) #Dinamica para el tiempo i\n",
+    "        A, B = concentracionA_B(resultado) # Separación de arreglos\n",
+    "\n",
+    "    return A, B, espaciamiento # Devuelve 3 arreglos"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#------------------------\n",
+    "#  FUNCIONES ADICIONALES\n",
+    "#------------------------\n",
+    "\n",
+    "#------------------------------------------\n",
+    "# Distribución de espaciamientos discreta\n",
+    "#------------------------------------------\n",
+    "\n",
+    "#La distribución de espaciamiento discreta se encuentra con la función P_i_xt(r_,l_,L_),\n",
+    "#la cual utiliza P_i(r,l,i).\n",
+    "\n",
+    "#Devuelve un arreglo por ejemplo: [0,0,1,0,0,0]\n",
+    "#Indicando que la distancia entre rma y lmb es 2\n",
+    "\n",
+    "def P_i(r,l,i):\n",
+    "    salida=0\n",
+    "    if (abs(r-l)==i):\n",
+    "        salida=1\n",
+    "    return salida\n",
+    "\n",
+    "def P_i_xt(r_,l_,L_):\n",
+    "    return [P_i(r_,l_,j) for j in range(2*L_+1)]\n",
+    "\n",
+    "\n",
+    "#------------------------------------\n",
+    "#  Separación de concentraciones\n",
+    "#------------------------------------\n",
+    "\n",
+    "#Entra un arreglo del tipo:    [-1,-1, 0, 1, 1]\n",
+    "# Y devuelve dos arreglos:     [ 1, 1, 0, 0, 0] --> Para las partículas A \n",
+    "#                              [ 0, 0, 0, 1, 1] --> Para las partículas B\n",
+    "\n",
+    "def concentracionA_B(entrada):\n",
+    "    salida_A = np.zeros(len(entrada))\n",
+    "    salida_B = np.zeros(len(entrada))\n",
+    "\n",
+    "    for i in range(len(entrada)):\n",
+    "\n",
+    "        if entrada[i] == -1:\n",
+    "            salida_A[i] = 1\n",
+    "\n",
+    "        elif entrada[i] == 1:\n",
+    "            salida_B[i] = 1\n",
+    "\n",
+    "    return salida_A, salida_B"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#--------------\n",
+    "#   ANALISIS\n",
+    "#--------------\n",
+    "def ANALISIS(L=5, dx=1, dt=1, D=0.5, j=1, K=1, tiempo=2000, rep=10, opcion='datos', nombre = 'Data'):\n",
+    "    \n",
+    "    #PARÁMETROS\n",
+    "    \n",
+    "    beta= K/dx # Tasa de reacción\n",
+    "    lamb = D/dx**2  #Tasa de salto\n",
+    "    P_S = lamb * dt # Probabilidad de salto\n",
+    "    P_J= j #Probabilidad de incersion\n",
+    "    P_R= beta*dt #Probabilidad de reacción\n",
+    "    \n",
+    "    #CONDICION INICIAL\n",
+    "    \n",
+    "    #  0 : Vacío \n",
+    "    # -1 : Partícula A\n",
+    "    #  1 : Particula B \n",
+    "    \n",
+    "    condicion_inicial=[-1 if i<L else 1 for i in range(2*L+1)] #Ilustracion para L=3: [-1,-1,-1,1,1,1]\n",
+    "\n",
+    "#-----------------------------------OPCIONES------------------------------------\n",
+    "    \n",
+    "    if opcion=='graficos':\n",
+    "\n",
+    "        x = np.linspace(-L, L, 2*L+1) #Posiciones\n",
+    "        z = np.linspace(0, 2*L, 2*L+1) #Distancias dist. de espaciamientos\n",
+    "\n",
+    "        salida_A=np.zeros(len(x))\n",
+    "        salida_B=np.zeros(len(x))\n",
+    "        salida_Desp=np.zeros(len(z))\n",
+    "        \n",
+    "        # Se almacena la información de TODA la dinámica en 3 arreglos de salida\n",
+    "        # Se suman cada iteración de tiempo para posteriormente hacer su respectiva normalización y promedio\n",
+    "        # y encontrar la densidad local contínua y dist. de espaciamientos contínua\n",
+    "\n",
+    "        for i in range(0,rep):\n",
+    "            A, B, d_esp = ciclos(condicion_inicial, L, P_R, P_J, P_S, tiempo) \n",
+    "\n",
+    "            salida_A = salida_A + A\n",
+    "            salida_B = salida_B + B\n",
+    "            salida_Desp = salida_Desp + d_esp\n",
+    "            \n",
+    "            # Cada 1000 iteraciones sacamos un print en pantalla para saber qué tal va\n",
+    "            if not(i % 1000):\n",
+    "                print(f'Working in iteration number {i} out of {rep}')\n",
+    "\n",
+    "        salida_A = salida_A/(rep*2*L)\n",
+    "        salida_B = salida_B/(rep*2*L)\n",
+    "        salida_Desp = salida_Desp/salida_Desp.sum()\n",
+    "\n",
+    "\n",
+    "        #--------------------------------------------------------\n",
+    "        #------------------ARCHIVOS------------------------------\n",
+    "        #--------------------------------------------------------\n",
+    "\n",
+    "        #Escribe 3 archivos txt en la carpeta Archi:\n",
+    "        # - Info para A\n",
+    "        # - Info para B\n",
+    "        # - Info para dist. de espaciamientos\n",
+    "\n",
+    "        nombre1 = 'Archi/'+str(nombre)+'A.txt'\n",
+    "        nombre2 = 'Archi/'+str(nombre)+'B.txt'\n",
+    "        nombre3 = 'Archi/'+str(nombre)+'Desp.txt'\n",
+    "\n",
+    "        File_A = open(nombre1, 'w')\n",
+    "        File_B = open(nombre2, 'w')\n",
+    "        File_P_i = open(nombre3, 'w')\n",
+    "\n",
+    "        for i in range(len(x)):\n",
+    "            File_A.write(str(x[i])+' '+str(salida_A[i])+'\\n')\n",
+    "            File_B.write(str(x[i])+' '+str(salida_B[i])+'\\n')\n",
+    "            File_P_i.write(str(z[i])+' '+str(salida_Desp[i])+'\\n')\n",
+    "\n",
+    "        File_A.close()\n",
+    "        File_B.close()\n",
+    "        File_P_i.close()\n",
+    "\n",
+    "\n",
+    "        #----------------------------------------------------------\n",
+    "        #----------------------GRAFICOS----------------------------\n",
+    "        #----------------------------------------------------------\n",
+    "\n",
+    "        #-------------------PERFILES DE DENSIDAD-------------------------\n",
+    "        fig1=plt.figure(1)\n",
+    "        plt.plot(x,salida_A,c='b')\n",
+    "        plt.plot(x,salida_B,c='r')\n",
+    "        plt.legend(['Particulas A', 'Particulas B'],loc='upper right',bbox_to_anchor=(1.35, 1))\n",
+    "        plt.xlabel('x')\n",
+    "        plt.ylabel('Perfil de densidad')\n",
+    "        plt.show()\n",
+    "\n",
+    "        #---------------DISTRIBUCIÓN DE ESPACIAMIENTOS--------------------\n",
+    "        fig2=plt.figure(2)\n",
+    "        plt.plot(z,salida_Desp,c='b', alpha=0.5)\n",
+    "        plt.xlabel('x')\n",
+    "        plt.ylabel('Distribución de espaciamientos')\n",
+    "        plt.show()\n",
+    "\n",
+    "    #-------------------------------------------------------------------\n",
+    "    \n",
+    "    #---------------\n",
+    "    #    Dinamica\n",
+    "    #---------------\n",
+    "    \n",
+    "    #Imprime en cada paso de tiempo, el vector concentración\n",
+    "    #Con esta opción se puede visualizar lo que ocurre en cada paso de tiempo\n",
+    "    \n",
+    "    elif opcion=='dinamica':\n",
+    "        \n",
+    "        salida_din=np.copy(condicion_inicial)\n",
+    "        \n",
+    "        for i in range(0,tiempo):\n",
+    "            print('tiempo ', i)\n",
+    "            salida_din, otro = Dinamica(salida_din, L, P_R, P_J, P_S)\n",
+    "            print(salida_din)\n",
+    "            print(' ')\n",
+    "    \n",
+    "    #--------------------------------------------------------------------\n",
+    "    \n",
+    "    #---------------\n",
+    "    #    Estacionario\n",
+    "    #---------------\n",
+    "    \n",
+    "    #Comprueba si se llega al estado estacionario en el tiempo ingresado. Esto se hace comparando\n",
+    "    #el sistema en el tiempo = 'tiempo' y tiempo = 'tiempo' + 1000\n",
+    "    \n",
+    "    elif opcion=='estacionario':\n",
+    "\n",
+    "        pruebas=[]\n",
+    "        \n",
+    "        #Evolución hasta el tiempo = 'tiempo'\n",
+    "        A_est, B_est, Desp_est = ciclos(condicion_inicial, L, P_R, P_J, P_S, tiempo)\n",
+    "            \n",
+    "        estacionario = B_est - A_est\n",
+    "\n",
+    "        pruebas.append(estacionario)\n",
+    "        print('Estado en la iteración '+ str(tiempo)+':')\n",
+    "        print(estacionario)\n",
+    "        print(' ')\n",
+    "        \n",
+    "        #Evolución hasta el tiempo = 'tiempo + 1000'\n",
+    "        A_est2, B_est2, Desp_est2 = ciclos(estacionario, L, P_R, P_J, P_S, 1000)\n",
+    "            \n",
+    "        estacionario2 = B_est2 - A_est2\n",
+    "        \n",
+    "        pruebas.append(estacionario2)\n",
+    "        print('Estado en la iteración '+ str(tiempo+1000)+':')\n",
+    "        print(estacionario2)\n",
+    "        print(' ')\n",
+    "\n",
+    "        salida_estacionario = pruebas[0] == pruebas[1]\n",
+    "        \n",
+    "        num_verdadero = list(salida_estacionario).count(True) \n",
+    "        \n",
+    "        print('Estado estacionario: ' + str(len(salida_estacionario) == num_verdadero))\n",
+    "\n",
+    "        return len(salida_estacionario) == num_verdadero\n",
+    "    "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Animaciones\n",
+    "\n",
+    "Para poder ver cómo es la dinámica del sistema, se escriben las siguientes líneas de código y funciones para generar una animación."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#-----------CREACION DEL CANVAS--------------\n",
+    "\n",
+    "L = 5 # 1/2 de la longitud del sistema\n",
+    "x = np.linspace(-L, L, 2*L+1) #Representacion del arreglo\n",
+    "y = np.zeros(2*L+1) #Para representar el arreglo unidimensional\n",
+    "\n",
+    "fig = plt.figure()\n",
+    "ax = plt.axes(xlim=(-L-1, L+1), ylim=(-0.005,0.005))\n",
+    "scatt = ax.scatter([],[],s=70)\n",
+    "plt.close()\n",
+    "\n",
+    "\n",
+    "#------------FUNCIONES PARA FUNCANIMATION--------------------\n",
+    "\n",
+    "# def init():\n",
+    "#     scatt.set_offsets([])\n",
+    "#     return scatt\n",
+    "\n",
+    "cmap = matplotlib.cm.bwr\n",
+    "norm = matplotlib.colors.Normalize(vmin=-1,vmax=1)\n",
+    "\n",
+    "def animate(i, *fargs):\n",
+    "\n",
+    "    concentracion = fargs[i]\n",
+    "\n",
+    "    scatt.set_offsets(np.c_[x,y])                    #Para correr los datos\n",
+    "    scatt.set_color(cmap(norm(concentracion)))       #Para los colores de la gráfica\n",
+    "    scatt.set_edgecolor('black')\n",
+    "\n",
+    "    return scatt,\n",
+    "\n",
+    "\n",
+    "#-----------FUNCIÓN PARA LAS ANIMACIONES (CONTIENE FUNCANIMATION)----------\n",
+    "\n",
+    "def animacion(time, Pr, Pj, Ps):\n",
+    "    \n",
+    "    #Longitud del arreglo predefinida:\n",
+    "    l=5\n",
+    "    \n",
+    "    # Se genera la dinámica del sistema utilizando la función 'Dinamica'\n",
+    "    # hasta llegar al tiempo 'time', los resultados obtenidos se almacenan\n",
+    "    # en la lista vec_animate\n",
+    "\n",
+    "    vec_animate = []\n",
+    "\n",
+    "    condicion_inicial=[-1 if i<l else 1 for i in range(2*l+1)]\n",
+    "\n",
+    "    salida = np.copy(condicion_inicial)\n",
+    "\n",
+    "    for i in range(time):\n",
+    "        salida, otro = Dinamica(salida, l, Pr, Pj, Ps)\n",
+    "        vec_animate.append(salida)\n",
+    "        \n",
+    "    \n",
+    "    # Se hace uso de FuncAnimation\n",
+    "    \n",
+    "    anim = FuncAnimation(fig, animate, frames=time - 1, interval=200, blit=True, repeat=False, fargs = vec_animate)\n",
+    "    \n",
+    "    \n",
+    "    # Se guarda como gif\n",
+    "\n",
+    "    nombre_gif = 'anim.gif'        \n",
+    "\n",
+    "    anim.save(nombre_gif, writer=matplotlib.animation.PillowWriter())\n",
+    "    \n",
+    "    \n",
+    "    # Se transforma el gif en mp4\n",
+    "\n",
+    "    nombre_video = 'video_dinamica.mp4'\n",
+    "\n",
+    "    clip = mp.VideoFileClip(nombre_gif)\n",
+    "    clip.write_videofile(nombre_video)\n",
+    "    \n",
+    "    return nombre_video\n"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.3"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}