diff --git a/stan/math/prim/functor/ode_rk45.hpp b/stan/math/prim/functor/ode_rk45.hpp index d45d42662af..0e99f80166f 100644 --- a/stan/math/prim/functor/ode_rk45.hpp +++ b/stan/math/prim/functor/ode_rk45.hpp @@ -12,58 +12,6 @@ namespace stan { namespace math { -/** - * Solve the ODE initial value problem y' = f(t, y), y(t0) = y0 at a set of - * times, { t1, t2, t3, ... } using the non-stiff Runge-Kutta 45 solver in Boost - * with a relative tolerance of 1e-10, an absolute tolerance of 1e-10, and - * taking a maximum of 1e8 steps. - * - * If the system of equations is stiff, ode_bdf will likely be - * faster. - * - * \p f must define an operator() with the signature as: - * template - * Eigen::Matrix, Eigen::Dynamic, 1> - * operator()(const T_t& t, const Eigen::Matrix& y, - * std::ostream* msgs, const T_Args&... args); - * - * t is the time, y is the state, msgs is a stream for error messages, and args - * are optional arguments passed to the ODE solve function (which are passed - * through to \p f without modification). - * - * @tparam F Type of ODE right hand side - * @tparam T_0 Type of initial time - * @tparam T_ts Type of output times - * @tparam T_Args Types of pass-through parameters - * - * @param f Right hand side of the ODE - * @param y0 Initial state - * @param t0 Initial time - * @param ts Times at which to solve the ODE at. All values must be sorted and - * not less than t0. - * @param relative_tolerance Relative tolerance passed to CVODES - * @param absolute_tolerance Absolute tolerance passed to CVODES - * @param max_num_steps Upper limit on the number of integration steps to - * take between each output (error if exceeded) - * @param[in, out] msgs the print stream for warning messages - * @param args Extra arguments passed unmodified through to ODE right hand side - * @return Solution to ODE at times \p ts - */ -template -std::vector< - Eigen::Matrix, Eigen::Dynamic, 1>> -ode_rk45(const F& f, const Eigen::Matrix& y0, - double t0, const std::vector& ts, std::ostream* msgs, - const Args&... args) { - double relative_tolerance = 1e-10; - double absolute_tolerance = 1e-10; - long int max_num_steps = 1e8; - - return ode_rk45_tol(f, y0, t0, ts, relative_tolerance, absolute_tolerance, - max_num_steps, msgs, args...); -} - /** * Solve the ODE initial value problem y' = f(t, y), y(t0) = y0 at a set of * times, { t1, t2, t3, ... } using the non-stiff Runge-Kutta 45 solver in Boost @@ -192,6 +140,58 @@ ode_rk45_tol(const F& f, return y; } +/** + * Solve the ODE initial value problem y' = f(t, y), y(t0) = y0 at a set of + * times, { t1, t2, t3, ... } using the non-stiff Runge-Kutta 45 solver in Boost + * with a relative tolerance of 1e-10, an absolute tolerance of 1e-10, and + * taking a maximum of 1e8 steps. + * + * If the system of equations is stiff, ode_bdf will likely be + * faster. + * + * \p f must define an operator() with the signature as: + * template + * Eigen::Matrix, Eigen::Dynamic, 1> + * operator()(const T_t& t, const Eigen::Matrix& y, + * std::ostream* msgs, const T_Args&... args); + * + * t is the time, y is the state, msgs is a stream for error messages, and args + * are optional arguments passed to the ODE solve function (which are passed + * through to \p f without modification). + * + * @tparam F Type of ODE right hand side + * @tparam T_0 Type of initial time + * @tparam T_ts Type of output times + * @tparam T_Args Types of pass-through parameters + * + * @param f Right hand side of the ODE + * @param y0 Initial state + * @param t0 Initial time + * @param ts Times at which to solve the ODE at. All values must be sorted and + * not less than t0. + * @param relative_tolerance Relative tolerance passed to CVODES + * @param absolute_tolerance Absolute tolerance passed to CVODES + * @param max_num_steps Upper limit on the number of integration steps to + * take between each output (error if exceeded) + * @param[in, out] msgs the print stream for warning messages + * @param args Extra arguments passed unmodified through to ODE right hand side + * @return Solution to ODE at times \p ts + */ +template +std::vector< + Eigen::Matrix, Eigen::Dynamic, 1>> +ode_rk45(const F& f, const Eigen::Matrix& y0, + T_t0 t0, const std::vector& ts, std::ostream* msgs, + const Args&... args) { + double relative_tolerance = 1e-10; + double absolute_tolerance = 1e-10; + long int max_num_steps = 1e8; + + return ode_rk45_tol(f, y0, t0, ts, relative_tolerance, absolute_tolerance, + max_num_steps, msgs, args...); +} + } // namespace math } // namespace stan #endif diff --git a/stan/math/rev/functor/ode_bdf.hpp b/stan/math/rev/functor/ode_bdf.hpp index e6336429d62..e7a16350f22 100644 --- a/stan/math/rev/functor/ode_bdf.hpp +++ b/stan/math/rev/functor/ode_bdf.hpp @@ -12,8 +12,7 @@ namespace math { /** * Solve the ODE initial value problem y' = f(t, y), y(t0) = y0 at a set of * times, { t1, t2, t3, ... } using the stiff backward differentiation formula - * (BDF) solver in CVODES with a relative tolerance of 1e-10, an absolute - * tolerance of 1e-10, and taking a maximum of 1e8 steps. + * BDF solver from CVODES. * * \p f must define an operator() with the signature as: * template @@ -47,21 +46,24 @@ template std::vector, Eigen::Dynamic, 1>> -ode_bdf(const F& f, const Eigen::Matrix& y0, - const T_t0& t0, const std::vector& ts, std::ostream* msgs, - const T_Args&... args) { - double relative_tolerance = 1e-10; - double absolute_tolerance = 1e-10; - long int max_num_steps = 1e8; +ode_bdf_tol(const F& f, const Eigen::Matrix& y0, + const T_t0& t0, const std::vector& ts, + double relative_tolerance, double absolute_tolerance, + long int max_num_steps, std::ostream* msgs, const T_Args&... args) { + auto integrator + = new stan::math::cvodes_integrator_vari( + f, y0, t0, ts, relative_tolerance, absolute_tolerance, max_num_steps, + msgs, args...); - return ode_bdf_tol(f, y0, t0, ts, relative_tolerance, absolute_tolerance, - max_num_steps, msgs, args...); + return (*integrator)(); } /** * Solve the ODE initial value problem y' = f(t, y), y(t0) = y0 at a set of * times, { t1, t2, t3, ... } using the stiff backward differentiation formula - * BDF solver from CVODES. + * (BDF) solver in CVODES with a relative tolerance of 1e-10, an absolute + * tolerance of 1e-10, and taking a maximum of 1e8 steps. * * \p f must define an operator() with the signature as: * template @@ -95,17 +97,15 @@ template std::vector, Eigen::Dynamic, 1>> -ode_bdf_tol(const F& f, const Eigen::Matrix& y0, - const T_t0& t0, const std::vector& ts, - double relative_tolerance, double absolute_tolerance, - long int max_num_steps, std::ostream* msgs, const T_Args&... args) { - auto integrator - = new stan::math::cvodes_integrator_vari( - f, y0, t0, ts, relative_tolerance, absolute_tolerance, max_num_steps, - msgs, args...); +ode_bdf(const F& f, const Eigen::Matrix& y0, + const T_t0& t0, const std::vector& ts, std::ostream* msgs, + const T_Args&... args) { + double relative_tolerance = 1e-10; + double absolute_tolerance = 1e-10; + long int max_num_steps = 1e8; - return (*integrator)(); + return ode_bdf_tol(f, y0, t0, ts, relative_tolerance, absolute_tolerance, + max_num_steps, msgs, args...); } } // namespace math