In [ ]:
from IPython.display import display
from ipywidgets import interact
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from pyodesys.symbolic import SymbolicSys
%matplotlib notebook

In [ ]:
def f(t, s, p):
    x, y, z = s['x'], s['y'], s['z']
    sigma, rho, beta = p['sigma'], p['rho'], p['beta']
    return {
        'x': sigma*(y - x),
        'y': x*(rho - z) - y,
        'z': x*y - beta*z
    }

In [ ]:
odesystem = SymbolicSys.from_callback(
    f, names='xyz', param_names='sigma rho beta'.split(),
    dep_by_name=True, par_by_name=True, indep_name='t')

In [ ]:
y0 = {'x': -10, 'y': -15, 'z': 15}
params = {'rho': 28, 'sigma': 10, 'beta': 8/3.}
integrate_kwargs = dict(integrator='cvode', nsteps=5000)
res = odesystem.integrate(10, y0, params, **integrate_kwargs)

In [ ]:
#fig = plt.figure()
res.plot(names='z')
_ = plt.legend()

In [ ]:
fig = plt.figure()
stack = []
def integrate_and_plot_3d(rho=28, sigma=10, beta=2.5):
    xout, yout, info = odesystem.integrate(
        10, y0, dict(sigma=sigma, rho=rho, beta=beta),
        integrator='cvode', nsteps=5000)
    ax = fig.gca(projection='3d')
    for lines in stack:
        lines[0].set_alpha(0.6*lines[0].get_alpha())
    stack.append(ax.plot(*yout.T, alpha=1.0, color='g'))
    if len(stack) > 4:
        lines = stack.pop(0)
        lines[0].remove()
    display(fig)
interact(integrate_and_plot_3d)