Ramsay, J. O., Hooker, G., Campbell, D., Cao, J., 2007, doi: 10.1111/j.1467-9868.2007.00610.x
%pylab inline
import odespy
import seaborn as sns
sns.set_style('white')
Populating the interactive namespace from numpy and matplotlib
def dydt(y,t,a,b,c,u):
V,R = y
dVdt = c*(V-V**3/3+R)+u(t)
dRdt = -(V-a+b*R)/c
return dVdt, dRdt
a,b,c = 0.2,0.2,3.
print odespy.list_available_solvers()
['AdamsBashMoulton2', 'AdamsBashMoulton3', 'AdamsBashforth2', 'AdamsBashforth3', 'AdamsBashforth4', 'Backward2Step', 'BackwardEuler', 'BogackiShampine', 'CashKarp', 'CrankNicolson', 'Dop853', 'Dopri5', 'DormandPrince', 'Euler', 'EulerCromer', 'Fehlberg', 'ForwardEuler', 'Heun', 'Leapfrog', 'LeapfrogFiltered', 'Lsoda', 'Lsodar', 'Lsode', 'Lsodes', 'Lsodi', 'Lsodis', 'Lsoibt', 'MidpointImplicit', 'MidpointIter', 'RK2', 'RK3', 'RK4', 'RKC', 'RKF45', 'RKFehlberg', 'Radau5', 'Radau5Explicit', 'Radau5Implicit', 'RungeKutta1', 'RungeKutta2', 'RungeKutta3', 'RungeKutta4', 'ThetaRule', 'Trapezoidal', 'Vode', 'lsoda_scipy', 'odefun_sympy']
solver = odespy.Lsode(dydt, f_args=(a,b,c,lambda t: 0))
solver.set_initial_condition((0.,0.))
y,t = solver.solve(np.linspace(0,50))
plot(t,y)
xlabel('t')
ylabel('y')
legend(labels=['Voltage','Recovery']);