An efficient method for solving highly oscillatory ordinary differential
  equations with applications to physical systems
  We present a novel numerical routine (oscode) with a C++ and Python interface
for the efficient solution of one-dimensional, second-order, ordinary
differential equations with rapidly oscillating solutions. The method is based
on a Runge-Kutta-like stepping procedure that makes use of the
Wentzel-Kramers-Brillouin (WKB) approximation to skip regions of integration
where the characteristic frequency varies slowly. In regions where this is not
the case, the method is able to switch to a made-to-measure Runge-Kutta
integrator that minimises the total number of function evaluations. We
demonstrate the effectiveness of the method with example solutions of the Airy
equation and an equation exhibiting a burst of oscillations, discussing the
error properties of the method in detail. We then show the method applied to
physical systems. First, the one-dimensional, time-independent Schr\"odinger
equation is solved as part of a shooting method to search for the energy
eigenvalues for a potential with quartic anharmonicity. Then, the method is
used to solve the Mukhanov-Sasaki equation describing the evolution of
cosmological perturbations, and the primordial power spectrum of the
perturbations is computed in different cosmological scenarios. We compare the
performance of our solver in calculating a primordial power spectrum of scalar
perturbations to that of BINGO, an efficient code specifically designed for
such applications.
