'Solve the IVP by integrating the ODE given some initial condition.
Parameters
t0 : float
Initial condition for the independent variable.
y0 : array_like (float, shape=(n,))
Initial condition for the dependent variables.
h : float, optional(default=1.0)
Step-size for computing the solution. Can be positive or negative
depending on the desired direction of integration.
T : int, optional(default=None)
Terminal value for the independent variable. One of either `T`
or `g` must be specified.
g : callable ``g(t, y, f_args)``, optional(default=None)
Provides a stopping condition for the integration. If specified
user must also specify a stopping tolerance, `tol`.
tol : float, optional (default=None)
Stopping tolerance for the integration. Only required if `g` is
also specifed.
integrator : str, optional(default=\'dopri5\')
Must be one of \'vode\', \'lsoda\', \'dopri5\', or \'dop853\'
step : bool, optional(default=False)
Allows access to internal steps for those solvers that use adaptive
step size routines. Currently only \'vode\', \'zvode\', and \'lsoda\'
support `step=True`.
relax : bool, optional(default=False)
Currently only \'vode\', \'zvode\', and \'lsoda\' support `relax=True`.
**kwargs : dict, optional(default=None)
Dictionary of integrator specific keyword arguments. See the
Notes section of the docstring for `scipy.integrate.ode` for a
complete description of solver specific keyword arguments.
Returns
solution: ndarray (float)
Simulated solution trajectory.'

def solve(self, t0, y0, h=1.0, T=None, g=None, tol=None, integrator='dopri5', step=False, relax=False, **kwargs):

    self._initialize_integrator(t0, y0, integrator, **kwargs)
    if ((g is not None) and (tol is not None)):
        soln = self._integrate_variable_trajectory(h, g, tol, step, relax)
    elif (T is not None):
        soln = self._integrate_fixed_trajectory(h, T, step, relax)
    else:
        mesg = "Either    both    'g'    and    'tol',    or    'T'    must    be    specified."
        raise ValueError(mesg)
    return soln
