What is Odespy?
Odespy (ODE Software in Python) offers a unified interface to a large collection of software for solving systems of ordinary differential equations (ODEs). There is also some support for Differential Algebraic Equations (DAEs).
You can pronounce Odespy by first saying the acronym ODE, for ordinary differential equations, in English (or in another language!) and then adding "spy" as in the English word spy.
How do I install Odespy?
Pip
Odespy requires Python version 2.7. The simplest procedure for
installing Odespy is to use pip
:
Terminal> sudo pip install -e git+https://github.com/hplgit/odespy.git#egg=odespy
Clone/fork repo
Alternatively, you can check out this repo and run setup.py
:
Terminal> git clone [email protected]:hplgit/odespy.git
Terminal> cd odespy
Terminal> sudo python setup.py install
Turning off Fortran compilation
If you face problems with compiling the Fortran parts of Odespy, or if you do not have a Fortran compiler, you can install without any Fortran code:
Terminal> sudo python setup.py install --no-fortran
Problems with compiled Fortran modules and Anaconda
Problems with the compiled Fortran libraries appear on different systems.
If you use Anaconda Python, successfully build the Fortran modules, but
get error messages like cannot find extension module _rkf
, the problem
may be related to GFortran 1.4. You may try
Terminal> cd /path/to/anaconda/lib/
Terminal> mv libgfortran.so.3.0.0 libgfortran.so.3.0.0.bak
Terminal> ln -sf /usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0 \
libgfortran.so.3.0.0
See also this link.
Problems with compiled Fortran modules on Windows
There have been various problems with compiling Odespy on Windows,
usually related to the Fortran compiler.
One recommended technique is to rely on Anaconda on Windows,
install the ming32
compiler, and then run
Terminal> python setup.py install build --compiler=ming32
This may give problems of the type
File "C:\Anaconda\lib\site-packages\numpy\distutils\fcompiler\gnu.py",
line 333, in get_libraries
raise NotImplementedError("Only MS compiler supported with gfortran on win64")
NotImplementedError: Only MS compiler supported with gfortran on win64
A remedy is to edit the gnu.py
file and comment out the
NotImplementedError
:
else:
#raise NotImplementedError("Only MS compiler supported with gfortran on win64")
pass
Install Pre-compiled Version with Conda
If you are using Anaconda or Miniconda and a build has been published for your system, then you can install a pre-compiled version of Odespy. Install using conda
with the following command:
Terminal> conda install -c https://conda.binstar.org/rothnic odespy
If a pre-compiled package is not available for your system, and you go through the effort of installing the compilation tools, you can build and upload a conda package as follows from the command line:
# Set environment variable in windows to build for python 2
# Use 34 instead of 27, to compile for python 3
set CONDA_PY=27
# Build the package
conda build odespy
# Upload the package
binstar upload <PATH to the build file>\odespy-<version>-<dependency versions>.tar.bz2
Notice. You may have to add/modify the conda build scripts to support your platform type. This has only been tested for Windows so far.
Contents of Odespy
Odespy features the following collection of numerical methods and implementations:
- Pure Python implementations of classical explicit schemes such as the Forward Euler method (also called Euler); Runge-Kutta methods of 2nd, 3rd, and 4th order; Heun's method; Adams-Bashforth methods of 2nd, 3rd, and 4th order; Adams-Bashforth-Moulton methods of 2nd and 3rd order.
- Pure Python implementations of classical implicit schemes such as Backward Euler; 2-step backward scheme; the theta rule; the Midpoint (or Trapezoidal) method.
- Pure Python implementations of adaptive explicit Runge-Kutta methods of type Runge-Kutta-Fehlberg of order (4,5), Dormand-Prince of order (4,5), Cash-Karp of order (4,5), Bogacki-Shampine of order (2,3).
- Wrappers for all FORTRAN solvers in
ODEPACK
. - Wrappers for the wrappers of FORTRAN solvers in
scipy
:vode
andzvode
(adaptive Adams or BDF fromvode.f
);dopri5
(adaptive Dormand-Prince method of order (4,5));dop853
(adaptive Dormand-Prince method of order 8(5,3));odeint
(adaptive Adams or BDF, basically the same asvode
, but in the implementationlsoda
fromODEPACK
). - Wrapper for the Runge-Kutta-Chebyshev formulas of order 2 as
offered by the well-known FORTRAN code
rkc.f
. - Wrapper for the Runge-Kutta-Fehlberg method of
order (4,5) as provided by the well-known FORTRAN code
rkf45.f
. - Wrapper for the Radau5 method as provided by the well-known FORTRAN code
radau5.f
. There have been some unidentified problems with running this solver (segmentation fault). - Wrapper for some solvers in the
odelab
.
The ODE problem can always be specified in Python, but for wrappers of FORTRAN codes one can also implement the problem in FORTRAN and avoid callback to Python.
Warning: Potential problems with FORTRAN codes.
Some users have faced problems with some of the FORTRAN-based solvers
(typically segmentation fault errors), mostly radau5
, but also rkf45
.
It seems that Odespy's Python interface to radau5
is broken.
How do I use Odespy?
Here is an example on the Odespy syntax
def f(u, t):
"""2x2 system for a van der Pool oscillator."""
return [u[1], 3.*(1. - u[0]*u[0])*u[1] - u[0]]
import odespy, numpy
solver = odespy.Vode(f, rtol=0.0, atol=1e-6,
adams_or_bdf='adams', order=10)
solver.set_initial_condition([2.0, 0.0])
t_points = numpy.linspace(0, 30, 150)
u, t = solver.solve(t_points)
u0 = u[:,0]
from matplotlib.pyplot import *
plot(t, u0)
show()
An incomplete tutorial is under development and explains much more of the syntax and provides many examples.
I have used Odespy in a publication - how do I cite it?
Please cite this GitHub repository:
H. P. Langtangen and L. Wang. Odespy software package. URL: https://github.com/hplgit/odespy. 2015
BibTeX entry:
@misc{odespy,
title = {{Odespy} Software Package},
author = {H. P. Langtangen and L. Wang},
url = {https://github.com/hplgit/odespy},
key = {odespy},
note = {\url{https://github.com/hplgit/odespy}},
year = {2015},
}
Publish entry:
* misc
** {Odespy} Software Package
key: odespy
author: H. P. Langtangen, L. Wang
url: https://github.com/hplgit/odespy
status: published
sortkey: Odespy
year: 2015
note: \url{https://github.com/hplgit/odespy}
entrytype: misc