In [1]:
import numpy as np
# importamos bibliotecas para plotear
import matplotlib
import matplotlib.pyplot as plt
# para desplegar los plots en el notebook
%matplotlib inline
# para cómputo simbólico
from sympy import *
# configuramos los símbolos alfa, beta, x y f para su uso en sympy
alpha, beta, x = symbols('alpha beta x')
f = symbols('f', cls=Function)
init_printing()
# importamos slider para experimentos interactivos
from __future__ import print_function
from ipywidgets import interact, interactive, fixed
import ipywidgets as widgets
def cobweb(f, x, y):
"""
Dibuja un diagrama de telaraña para una función.
"""
plt.axhline(linewidth=1.0, color="black")
plt.axvline(linewidth=1.0, color="black")
plt.ylim((y.min(),y.max()))
indep = np.linspace(x.min(), x.max(), len(x))
# grafica la funcion
plt.plot(indep,f(indep),'blue')
# grafica la diagonal
plt.plot(indep, indep, 'black')
# grafica la telaraña
y0 = f(x[0])
x0 = x[0]
for i in range(len(x)):
plt.hlines(y0, x0, y0,'r')
x0 = y0
y0 = f(x0)
plt.vlines(x0, x0, y0,'r')
In [2]:
def g(x, alpha, beta):
assert alpha >= 0 and beta >= 0
return (alpha*x)/(1 + (beta * x))
In [3]:
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))
Out[3]:
In [4]:
# primera iterada
f0 = (alpha*x)/(1+beta*x)
Eq(f(x),f0)
Out[4]:
In [5]:
# segunda iterada
# subs-tituye f0 en la x de f0 para generar f1
f1 = simplify(f0.subs(x, f0))
Eq(f(f(x)), f1)
Out[5]:
In [6]:
# tercera iterada
f2 = simplify(f1.subs(x, f1))
Eq(f(f(f(x))), f2)
Out[6]:
In [7]:
# cuarta iterada
f3 = simplify(f2.subs(x, f2))
Eq(f(f(f(f(x)))), f3)
Out[7]:
In [8]:
# puntos fijos resolviendo la primera iterada
solveset(Eq(f1,x),x)
Out[8]:
In [9]:
(alpha-1)/beta
Out[9]:
In [10]:
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'))
Out[10]:
In [11]:
# con alfa=1 y beta=1
Eq(collect(f3, x), x/(x+1))
Out[11]:
In [12]:
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))
Out[12]: