<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 La función
Esta ecuación por Glass y Pasternack (1978) sirve para modelar redes neuronales y de interacción génica.
$$x_{t+1}=\frac{\alpha x_{t}}{1+\beta x_{t}}$$
Donde $\alpha$ y $\beta$ son números positivos y $x_{t}\geq0$.
Step1:  Búsqueda algebráica de puntos fijos
A continuación sustituiremos f(x) en x reiteradamente hasta obtener la cuarta iterada de f.
Step2:  Punto fijo oscilatorio
Al configurar $$\alpha, \beta$$ de modo que haya un punto fijo la serie de tiempo revela una oscilación entre cero y el punto fijo.
Step3:  ¿Qué pasará con infinitas iteraciones?
Todo parece indicar que la función converge a 1 si $\alpha=1$ y $\beta=1$.
Si no, converge a $\frac{\alpha}{\beta}$
<ASSISTANT_TASK:>
Python Code:
def g(x, alpha, beta):
    assert alpha >= 0 and beta >= 0
    return (alpha*x)/(1 + (beta * x))
def plot_cobg(x, alpha, beta):  
    y = np.linspace(x[0],x[1],300)
    g_y = g(y, alpha, beta)
    cobweb(lambda x: g(x, alpha, beta), y, g_y)
# configura gráfica interactiva
interact(plot_cobg,
         x=widgets.FloatRangeSlider(min=0.01, max=3, step=0.01,
                                    value=[0.02, 3],
                                    continuous_update=False),
         alpha=widgets.FloatSlider(min=0.001, max=30,step=0.01,
                                   value=12, continuous_update=False),
         beta=widgets.FloatSlider(min=0.001, max=30,step=0.01,
                                  value=7, continuous_update=False))
Explanation: La función
Esta ecuación por Glass y Pasternack (1978) sirve para modelar redes neuronales y de interacción génica.
$$x_{t+1}=\frac{\alpha x_{t}}{1+\beta x_{t}}$$
Donde $\alpha$ y $\beta$ son números positivos y $x_{t}\geq0$.
End of explanation
# primera iterada
f0 = (alpha*x)/(1+beta*x)
Eq(f(x),f0)
# segunda iterada
# subs-tituye f0 en la x de f0 para generar f1
f1 = simplify(f0.subs(x, f0))
Eq(f(f(x)), f1)
# tercera iterada
f2 = simplify(f1.subs(x, f1))
Eq(f(f(f(x))), f2)
# cuarta iterada
f3 = simplify(f2.subs(x, f2))
Eq(f(f(f(f(x)))), f3)
# puntos fijos resolviendo la primera iterada
solveset(Eq(f1,x),x)
(alpha-1)/beta
Explanation: Búsqueda algebráica de puntos fijos
A continuación sustituiremos f(x) en x reiteradamente hasta obtener la cuarta iterada de f.
End of explanation
def solve_g(a, b):
    y = list(np.linspace(0,float(list(solveset(Eq(f1.subs(alpha, a).subs(beta, b), x), x)).pop()),2))
    for t in range(30):
        y.append(g(y[t], a, b))
    zoom = plt.plot(y)
    print("ultimos 15 de la serie:")
    pprint(y[-15:])
    print("\npuntos fijos:")
    return solveset(Eq(f1.subs(alpha, a).subs(beta, b), x), x)
    
# gráfica interactiva
interact(solve_g,
         a=widgets.IntSlider(min=0, max=30, step=1,
                             value=11, continuous_update=False,
                             description='alpha'),
         b=widgets.IntSlider(min=0, max=30, step=1,
                             value=5, continuous_update=False,
                             description='beta'))
Explanation: Punto fijo oscilatorio
Al configurar $$\alpha, \beta$$ de modo que haya un punto fijo la serie de tiempo revela una oscilación entre cero y el punto fijo.
End of explanation
# con alfa=1 y beta=1
Eq(collect(f3, x), x/(x+1))
def plot_g(x, alpha, beta):
    pprint(x)
    y = np.linspace(x[0],x[1],300)
    g_y = g(y, alpha, beta)
    fig1 = plt.plot(y, g_y)
    fig1 = plt.plot(y, y, color='red')
    plt.axis('equal')
interact(plot_g,
         x=widgets.FloatRangeSlider(min=0, max=30, step=0.01, value=[0,1], continuous_update=False),
         alpha=widgets.IntSlider(min=0,max=30,step=1,value=1, continuous_update=False),
         beta=widgets.IntSlider(min=0,max=30,step=1,value=1, continuous_update=False))
Explanation: ¿Qué pasará con infinitas iteraciones?
Todo parece indicar que la función converge a 1 si $\alpha=1$ y $\beta=1$.
Si no, converge a $\frac{\alpha}{\beta}$
End of explanation
<END_TASK>