[SciPy-Dev] ODE solvers

Sturla Molden sturla.molden at gmail.com
Thu Jun 4 11:25:12 EDT 2015


On 04/06/15 14:55, Anne Archibald wrote:

> This seems like a fairly clean and flexible solution. integrate.quad
> also seems to have some kind of arrangement involving ctypes? I guess
> you could just have a particular subclass that called via ctypes.

We can get a function pointer as a void* from ctypes too. An ODE solver 
could accept this too. I would also suggest that we allow an f2py object 
as callback as it has a _cpointer attribute (PyCObject) which stores the 
function pointer in a void*.

So now we have at least four different things that can be allowed as 
callback:

1. Any Python callable object
2. Subclass of a certain Cython cdef class
3. ctypes function object
4. f2py Fortran object

The latter three we can optimize for maximum efficiency.

With ctypes and f2py we need to handle the GIL. It should not be 
released if the ctypes callback is from a PyDLL, but it can be released 
if from a C DLL. And if it is an f2py object we must check to see if the 
callable is threadsafe. (Is this attribute exposed somehow?) With Cython 
it is easier because we can just use a different class with nogil callback.


>     Another thing:
>
>     We should have more solvers, even simple ones like Euler and 4th order
>     Runge-Kutta for reference. We also lack Bulirsch-Stoer. Ot seems we just
>     have those that are in odepack.
>
> Why the simple ones? Is the idea to provide some baseline solver for
> comparisons?

Sometimes I have wondered if I got a weird solution because my ODE did 
not converge correctly or because it should be be this weird.

We do have a dense RK3/8 solver in SciPy, though. It was actually 
published in the same paper as RK4 and does the same thing. RK4 is the 
classical one that is in every textbook. It might not be that those who 
look for RK4 knows that RK3/8 is almost equivalent.


> Still, a clean pure-python RK45 with adaptive step-size
> control and dense output wouldn't hurt.

Yes, similar to ode45 is Matlab. Fehlberg method or whatever it is called.


> That said, a good B-S integrator would be valuable, since there doesn't
> seem to be anything too suitable for high-accuracy solution of smooth
> problems. It also doesn't seem too complicated to implement, even in
> dense form.

B-S is not difficult to implement.

There is also a C++ implementation in last edition of the "book that 
must not be named". Thus far I am untainted by not having looked at it.


Personally I am mostly interested in solvers for sparse systems, e.g. 
for compartmental models of neurons. But I think all solvers in SciPy 
are intended for dense sets of equations.


Sturla




More information about the SciPy-Dev mailing list