Version 6 (modified by warren.weckesser, 3 years ago)

--

See Task #919

The scipy.integrate.ode/odeint API needs some cleanup. This page details a suggestion what a revised API should look like.

Problems with current api

  • ode is a class, odeint a function
  • ode has different semantics than odeint for the callback function

Proposed API

The idea would be to follow the lead of the scipy.interpolate API (cf. eg. KroghInterpolate).

  1. CamelCase classes Vode, Zvode, Dopri, etc., functionality similar to ode
  2. Thin wrapper functions vode, zvode, ..., with functionality similar to odeint

The second point could perhaps also be

  1. One wrapper function odeint (or something similar) with a suitable keyword argument.

Use cases

Integrate a simple ODE

import numpy as np
from scipy.integrate import vode

def f(t,y):
    return -2*y + np.array([np.cos(t),0,0])

t = np.linspace(0, 20, 200)
y = np.vode(f, t=t, y0=[0,1,2])

Open questions

  • Are the named classes Vode etc. discoverable? (Having names of different solvers in class names is obscure.) The currently published docs don't show the integrators, e.g. http://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.ode.html but >>> help(scipy.integrate.ode) does. If Vode etc. are properly indexed then the sphinx documentation should make them discoverable (with search). And if ode class doesn't shadow the ode module then module docs can be incorporated in the documentation
  • Is complex_ode separate from ode/odeint or should it have the same changes to the API or merged? help(scipy.integrate.complex_ode) doesn't show which integrators are available