This open access volume explains the foundations of modern solvers for ordinary differential
equations (ODEs). Formulating and solving ODEs is an essential part of mathematical modeling
and computational science  and numerous solvers are available in commercial and open source
software. However  no single ODE solver is the best choice for every single problem  and
choosing the right solver requires fundamental insight into how the solvers work. This book
will provide exactly that insight  to enable students and researchers to select the right
solver for any ODE problem of interest  or implement their own solvers if needed. The
presentation is compact and accessible  and focuses on the large and widely used class of
solvers known as Runge-Kutta methods. Explicit and implicit methods are motivated and explained
as well as methods for error control and automatic time step selection  and all the solvers are
implemented as a class hierarchy in Python.