{"id":106719,"date":"2026-09-18T06:40:32","date_gmt":"2026-09-17T22:40:32","guid":{"rendered":"https:\/\/www.wsisp.com\/helps\/106719.html"},"modified":"2026-09-18T06:40:32","modified_gmt":"2026-09-17T22:40:32","slug":"c%e4%bb%a3%e7%a0%81%e5%ae%9e%e7%8e%b0matlab%e4%b8%ad%e7%9a%84ode45%e5%87%bd%e6%95%b0%e5%8a%9f%e8%83%bd","status":"publish","type":"post","link":"https:\/\/www.wsisp.com\/helps\/106719.html","title":{"rendered":"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd"},"content":{"rendered":"<p>                    <span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stddef.h&gt;<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ C callback for derivatives: fills dydt of length n given y of length n at time t.<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ode45_deriv_cb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> dydt<span class=\"token punctuation\">,<\/span> size_t n<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Integrate from t0 to t1 using Dormand-Prince 5(4) with adaptive steps<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Integrate from t0 to t1 using Dormand-Prince 5(4) with adaptive steps.<\/span><br \/>\n<span class=\"token comment\">\/\/ Inputs:<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; t0, y0[n]: initial time\/state<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; t1: target time<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; h_init: initial step size (non-zero)<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; atol, rtol: tolerances<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; normControl: 0 (component-wise max) or 1 (global 2-norm)<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; max_steps: safety cap<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; cb, ctx: derivative callback &#043; user context<\/span><br \/>\n<span class=\"token comment\">\/\/ Output:<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; y_out[n]: state at t1<\/span><br \/>\n<span class=\"token comment\">\/\/ Returns 0 on success, non-zero on failure.<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">ode45_integrate_final<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t n<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> t1<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> normControl<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> max_steps<span class=\"token punctuation\">,<\/span><br \/>\n                          ode45_deriv_cb cb<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y_out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Integrate and return samples at explicit times.<\/span><br \/>\n<span class=\"token comment\">\/\/ Inputs:<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; t0, y0[n]<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; times[m]: strictly monotone in desired direction (first equals t0 recommended)<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; Remaining parameters like above.<\/span><br \/>\n<span class=\"token comment\">\/\/ Output:<\/span><br \/>\n<span class=\"token comment\">\/\/ &#8211; y_out[m*n]: concatenated row-major blocks of length n for each time.<\/span><br \/>\n<span class=\"token comment\">\/\/ Returns 0 on success, non-zero on failure.<\/span><br \/>\n<span class=\"token keyword\">int<\/span> <span class=\"token function\">ode45_integrate_times<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t n<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> times<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t m<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> normControl<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> max_steps<span class=\"token punctuation\">,<\/span><br \/>\n                          ode45_deriv_cb cb<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y_out<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">ifdef<\/span> <span class=\"token expression\">__cplusplus<\/span><\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">endif<\/span><\/span><\/p>\n<p><span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cmath&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;cstdlib&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;functional&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iomanip&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;iostream&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;limits&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;stdexcept&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;array&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;utility&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;string&gt;<\/span><\/span><br \/>\n<span class=\"token macro property\"><span class=\"token directive-hash\">#<\/span><span class=\"token directive keyword\">include<\/span> <span class=\"token string\">&lt;vector&gt;<\/span><\/span><\/p>\n<p><span class=\"token comment\">\/\/ Standalone Dormand-Prince 5(4) (DOPRI5) adaptive Runge-Kutta integrator.<\/span><br \/>\n<span class=\"token comment\">\/\/ No Boost dependencies.<\/span><br \/>\n<span class=\"token keyword\">using<\/span> State <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">using<\/span> DerivFunc <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>function<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">void<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> <span class=\"token comment\">\/*t*\/<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> <span class=\"token comment\">\/*y*\/<\/span><span class=\"token punctuation\">,<\/span> State<span class=\"token operator\">&amp;<\/span> <span class=\"token comment\">\/*dydt*\/<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Forward declaration for NormControl two-norm error<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">double<\/span> <span class=\"token function\">two_norm_scaled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y_next<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">static<\/span> State <span class=\"token function\">zeros_like<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token function\">State<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Dense output for Dormand-Prince 5(4): Hermite quartic interpolation (Octave-like)<\/span><br \/>\n<span class=\"token keyword\">static<\/span> State <span class=\"token function\">dopri5_dense_output<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> dt<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> x0<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> x1<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>array<span class=\"token operator\">&lt;<\/span>State<span class=\"token punctuation\">,<\/span><span class=\"token number\">7<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> K<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> s<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ s in [0,1], dt &#061; h, K[0]&#061;k1 at t, K[6]&#061;k7 at t&#043;dt<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> size_t n <span class=\"token operator\">&#061;<\/span> x0<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    State <span class=\"token function\">out<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> out<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ Coefficients for u_half &#061; y(t&#043;dt\/2)<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c_half<span class=\"token punctuation\">[<\/span><span class=\"token number\">7<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token number\">6025192743.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">30085553152.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">51252292925.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">65400821598.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2691868925.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">45128329728.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">187940372067.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">1594534317056.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1776094331.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">19743644256.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n        <span class=\"token number\">11237099.0<\/span><span class=\"token operator\">\/<\/span><span class=\"token number\">235043384.0<\/span><span class=\"token punctuation\">,<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    State <span class=\"token function\">u_half<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> acc <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> k <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> k <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">7<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>k<span class=\"token punctuation\">)<\/span> acc <span class=\"token operator\">&#043;&#061;<\/span> c_half<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">*<\/span> K<span class=\"token punctuation\">[<\/span>k<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        u_half<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> x0<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">0.5<\/span> <span class=\"token operator\">*<\/span> dt <span class=\"token operator\">*<\/span> acc<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ Hermite quartic basis polynomials<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> s2 <span class=\"token operator\">&#061;<\/span> s<span class=\"token operator\">*<\/span>s<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> s3 <span class=\"token operator\">&#061;<\/span> s2<span class=\"token operator\">*<\/span>s<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> s4 <span class=\"token operator\">&#061;<\/span> s3<span class=\"token operator\">*<\/span>s<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> H0 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">11.0<\/span><span class=\"token operator\">*<\/span>s2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">18.0<\/span><span class=\"token operator\">*<\/span>s3 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">8.0<\/span><span class=\"token operator\">*<\/span>s4<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> H1 <span class=\"token operator\">&#061;<\/span> s <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">4.0<\/span><span class=\"token operator\">*<\/span>s2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">5.0<\/span><span class=\"token operator\">*<\/span>s3 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">2.0<\/span><span class=\"token operator\">*<\/span>s4<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> H2 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">16.0<\/span><span class=\"token operator\">*<\/span>s2 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">32.0<\/span><span class=\"token operator\">*<\/span>s3 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">16.0<\/span><span class=\"token operator\">*<\/span>s4<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> H3 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">5.0<\/span><span class=\"token operator\">*<\/span>s2 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">14.0<\/span><span class=\"token operator\">*<\/span>s3 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">8.0<\/span><span class=\"token operator\">*<\/span>s4<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> H4 <span class=\"token operator\">&#061;<\/span> s2 <span class=\"token operator\">&#8211;<\/span> <span class=\"token number\">3.0<\/span><span class=\"token operator\">*<\/span>s3 <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">2.0<\/span><span class=\"token operator\">*<\/span>s4<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        out<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> H0 <span class=\"token operator\">*<\/span> x0<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><br \/>\n               <span class=\"token operator\">&#043;<\/span> H1 <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>dt <span class=\"token operator\">*<\/span> K<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><br \/>\n               <span class=\"token operator\">&#043;<\/span> H2 <span class=\"token operator\">*<\/span> u_half<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><br \/>\n               <span class=\"token operator\">&#043;<\/span> H3 <span class=\"token operator\">*<\/span> x1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><br \/>\n               <span class=\"token operator\">&#043;<\/span> H4 <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>dt <span class=\"token operator\">*<\/span> K<span class=\"token punctuation\">[<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">return<\/span> out<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">double<\/span> <span class=\"token function\">inf_norm_scaled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y_next<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ Matches Octave&#039;s AbsRel_norm with NormControl &#061;&#061; false:<\/span><br \/>\n    <span class=\"token comment\">\/\/ err_norm &#061; max_i (|err_i| \/ scale_i), scale_i &#061; max(AbsTol, RelTol * max(|y_i|, |y_next_i|))<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> err<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> y_next<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;State size mismatch&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> max_ratio <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> err<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> sc <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>atol<span class=\"token punctuation\">,<\/span> rtol <span class=\"token operator\">*<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>y_next<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> r <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>sc <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> sc<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>r <span class=\"token operator\">&gt;<\/span> max_ratio<span class=\"token punctuation\">)<\/span> max_ratio <span class=\"token operator\">&#061;<\/span> r<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> max_ratio<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Performs one DOPRI5 step. Computes y_next (5th order) and err (difference 5th-4th).<\/span><br \/>\n<span class=\"token keyword\">static<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token function\">runge_kutta_dopri5_step<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> DerivFunc<span class=\"token operator\">&amp;<\/span> f<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> t<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> h<span class=\"token punctuation\">,<\/span> State<span class=\"token operator\">&amp;<\/span> y_next<span class=\"token punctuation\">,<\/span><br \/>\nState<span class=\"token operator\">&amp;<\/span> err<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span>array<span class=\"token operator\">&lt;<\/span>State<span class=\"token punctuation\">,<\/span><span class=\"token number\">7<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> K<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> size_t n <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>n <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        y_next<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        err<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    State <span class=\"token function\">k1<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k2<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k3<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k4<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k5<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k6<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">k7<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    State <span class=\"token function\">tmp<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ Butcher tableau coefficients for Dormand-Prince 5(4)<\/span><br \/>\n    <span class=\"token comment\">\/\/ c_i<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c2 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">5.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c3 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">10.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c4 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">4.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">5.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c5 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">8.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">9.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c6 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> c7 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ a (lower triangular):<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a21 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">5.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a31 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">3.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">40.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a32 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">9.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">40.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a41 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">44.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">45.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a42 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">56.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">15.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a43 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">32.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">9.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a51 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">19372.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">6561.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a52 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">25360.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">2187.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a53 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">64448.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">6561.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a54 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">212.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">729.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a61 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">9017.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">3168.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a62 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">355.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">33.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a63 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">46732.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">5247.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a64 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">49.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">176.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a65 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">5103.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">18656.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a71 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">35.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">384.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a72 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a73 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">500.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">1113.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a74 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">125.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">192.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a75 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2187.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">6784.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> a76 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">11.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">84.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ b (5th order) equals row 7 coefficients (a71..a76) with b7&#061;0.<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b1 <span class=\"token operator\">&#061;<\/span> a71<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b2 <span class=\"token operator\">&#061;<\/span> a72<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b3 <span class=\"token operator\">&#061;<\/span> a73<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b4 <span class=\"token operator\">&#061;<\/span> a74<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b5 <span class=\"token operator\">&#061;<\/span> a75<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b6 <span class=\"token operator\">&#061;<\/span> a76<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> b7 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ b_hat (4th order):<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh1 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5179.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">57600.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh2 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh3 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">7571.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">16695.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh4 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">393.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">640.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh5 <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">92097.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">339200.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh6 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">187.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">2100.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">constexpr<\/span> <span class=\"token keyword\">double<\/span> bh7 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token number\">40.0<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k1<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> k1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k2<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> tmp<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>a21 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c2 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> tmp<span class=\"token punctuation\">,<\/span> k2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k3<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> tmp<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>a31 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a32 <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c3 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> tmp<span class=\"token punctuation\">,<\/span> k3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k4<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> tmp<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>a41 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a42 <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a43 <span class=\"token operator\">*<\/span> k3<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c4 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> tmp<span class=\"token punctuation\">,<\/span> k4<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k5<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n    tmp<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>a51 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a52 <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a53 <span class=\"token operator\">*<\/span> k3<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a54 <span class=\"token operator\">*<\/span> k4<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c5 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> tmp<span class=\"token punctuation\">,<\/span> k5<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k6<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n    tmp<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>a61 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a62 <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a63 <span class=\"token operator\">*<\/span> k3<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a64 <span class=\"token operator\">*<\/span> k4<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> a65 <span class=\"token operator\">*<\/span> k5<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c6 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> tmp<span class=\"token punctuation\">,<\/span> k6<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ 5th order solution y_next using b1..b6<\/span><br \/>\ny_next<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span><br \/>\n    y_next<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span>b1 <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b2 <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b3 <span class=\"token operator\">*<\/span> k3<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b4 <span class=\"token operator\">*<\/span> k4<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b5 <span class=\"token operator\">*<\/span> k5<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b6 <span class=\"token operator\">*<\/span> k6<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> b7 <span class=\"token operator\">*<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ k7 evaluated at (t&#043;h, y_next)<\/span><br \/>\n<span class=\"token function\">f<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> c7 <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> k7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ error estimate (difference between 5th and 4th order solutions)<\/span><br \/>\nerr<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> e <span class=\"token operator\">&#061;<\/span> h <span class=\"token operator\">*<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>b1 <span class=\"token operator\">&#8211;<\/span> bh1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>b2 <span class=\"token operator\">&#8211;<\/span> bh2<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k2<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>b3 <span class=\"token operator\">&#8211;<\/span> bh3<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k3<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>b4 <span class=\"token operator\">&#8211;<\/span> bh4<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k4<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span><br \/>\n                          <span class=\"token punctuation\">(<\/span>b5 <span class=\"token operator\">&#8211;<\/span> bh5<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k5<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span>b6 <span class=\"token operator\">&#8211;<\/span> bh6<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k6<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#043;<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token number\">0.0<\/span> <span class=\"token operator\">&#8211;<\/span> bh7<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> k7<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    err<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> e<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Export stages for dense output interpolation<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k2<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k3<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k4<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">4<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k5<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k6<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\nK<span class=\"token punctuation\">[<\/span><span class=\"token number\">6<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>k7<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Adaptive integration wrapper.<\/span><br \/>\n<span class=\"token keyword\">static<\/span> State <span class=\"token function\">integrate_runge_kutta_dopri5<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> DerivFunc<span class=\"token operator\">&amp;<\/span> f<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">double<\/span> t1<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">bool<\/span> normControl <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">,<\/span><br \/>\n                                          <span class=\"token keyword\">int<\/span> max_steps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_init <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;h_init must be non-zero&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>max_steps <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_steps must be positive&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> dir <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>t1 <span class=\"token operator\">&gt;&#061;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t <span class=\"token operator\">&#061;<\/span> t0<span class=\"token punctuation\">;<\/span><br \/>\n    State y <span class=\"token operator\">&#061;<\/span> y0<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> h <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>h_init<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> dir<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token comment\">\/\/ Step-size control parameters<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> safety <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> min_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> max_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> tiny <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token class-name\">numeric_limits<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> step <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> step <span class=\"token operator\">&lt;<\/span> max_steps<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>step<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&gt;&#061;<\/span> t1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&lt;&#061;<\/span> t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> y<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ Clamp step to hit t1 exactly<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&gt;<\/span> t1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&lt;<\/span> t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            h <span class=\"token operator\">&#061;<\/span> t1 <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        State y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>array<span class=\"token operator\">&lt;<\/span>State<span class=\"token punctuation\">,<\/span><span class=\"token number\">7<\/span><span class=\"token operator\">&gt;<\/span> K<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">runge_kutta_dopri5_step<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> h<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">,<\/span> K<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> err_norm <span class=\"token operator\">&#061;<\/span> normControl<br \/>\n            <span class=\"token operator\">?<\/span> <span class=\"token function\">two_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token operator\">:<\/span> <span class=\"token function\">inf_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ Accept step<\/span><br \/>\n            t <span class=\"token operator\">&#043;&#061;<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n            y<span class=\"token punctuation\">.<\/span><span class=\"token function\">swap<\/span><span class=\"token punctuation\">(<\/span>y_next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Compute next step size<\/span><br \/>\n        <span class=\"token comment\">\/\/ Embedded RK 5(4): controller exponent 1\/5.<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&lt;&#061;<\/span> tiny<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> max_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ Non-finite error: shrink step aggressively<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> min_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> safety <span class=\"token operator\">*<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">pow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> err_norm<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        factor <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>max_factor<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>min_factor<span class=\"token punctuation\">,<\/span> factor<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n        h <span class=\"token operator\">*&#061;<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Step size underflow&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token comment\">\/\/ If rejected (including non-finite), try again without advancing time\/state.<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Reached max_steps without finishing integration&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Trajectory<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span> t<span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span>State<span class=\"token operator\">&gt;<\/span> y<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Integrate and return dense output samples according to refine (&gt;&#061;1)<\/span><br \/>\n<span class=\"token keyword\">static<\/span> Trajectory <span class=\"token function\">integrate_runge_kutta_dopri5_refined<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> DerivFunc<span class=\"token operator\">&amp;<\/span> f<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">double<\/span> t1<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">bool<\/span> normControl<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">int<\/span> refine<span class=\"token punctuation\">,<\/span><br \/>\n                                                       <span class=\"token keyword\">int<\/span> max_steps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_init <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;h_init must be non-zero&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>max_steps <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_steps must be positive&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>refine <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> refine <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> dir <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>t1 <span class=\"token operator\">&gt;&#061;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t <span class=\"token operator\">&#061;<\/span> t0<span class=\"token punctuation\">;<\/span><br \/>\n    State y <span class=\"token operator\">&#061;<\/span> y0<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> h <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>h_init<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> dir<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> safety <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> min_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> max_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> tiny <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token class-name\">numeric_limits<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    Trajectory traj<span class=\"token punctuation\">;<\/span><br \/>\n    traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> step <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> step <span class=\"token operator\">&lt;<\/span> max_steps<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>step<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&gt;&#061;<\/span> t1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&lt;&#061;<\/span> t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">return<\/span> traj<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&gt;<\/span> t1<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&lt;<\/span> t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            h <span class=\"token operator\">&#061;<\/span> t1 <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        State y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>array<span class=\"token operator\">&lt;<\/span>State<span class=\"token punctuation\">,<\/span><span class=\"token number\">7<\/span><span class=\"token operator\">&gt;<\/span> K<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">runge_kutta_dopri5_step<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> h<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">,<\/span> K<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> err_norm <span class=\"token operator\">&#061;<\/span> normControl<br \/>\n            <span class=\"token operator\">?<\/span> <span class=\"token function\">two_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token operator\">:<\/span> <span class=\"token function\">inf_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">1.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ Accepted: emit interior refined points using dense output<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> dt <span class=\"token operator\">&#061;<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> refine<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> s <span class=\"token operator\">&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>refine<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                State yi <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">dopri5_dense_output<\/span><span class=\"token punctuation\">(<\/span>dt<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> K<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>t <span class=\"token operator\">&#043;<\/span> s <span class=\"token operator\">*<\/span> h<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>yi<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ Endpoint<\/span><br \/>\n            t <span class=\"token operator\">&#043;&#061;<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n            y<span class=\"token punctuation\">.<\/span><span class=\"token function\">swap<\/span><span class=\"token punctuation\">(<\/span>y_next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Step-size controller<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&lt;&#061;<\/span> tiny<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> max_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> min_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> safety <span class=\"token operator\">*<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">pow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> err_norm<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>max_factor<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>min_factor<span class=\"token punctuation\">,<\/span> factor<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        h <span class=\"token operator\">*&#061;<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Step size underflow&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Reached max_steps without finishing integration&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ Integrate and return samples exactly at requested times using dense output per accepted step.<\/span><br \/>\n<span class=\"token keyword\">static<\/span> Trajectory <span class=\"token function\">integrate_runge_kutta_dopri5_at_times<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> DerivFunc<span class=\"token operator\">&amp;<\/span> f<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token operator\">&amp;<\/span> times<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">bool<\/span> normControl<span class=\"token punctuation\">,<\/span><br \/>\n                                                        <span class=\"token keyword\">int<\/span> max_steps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100000<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h_init <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;h_init must be non-zero&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>max_steps <span class=\"token operator\">&lt;&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;max_steps must be positive&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;times must be non-empty&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ Ensure monotonicity direction matches integration<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> dir <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">:<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ t0 must equal first time to match initial condition semantics<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t0<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        t0 <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">double<\/span> t <span class=\"token operator\">&#061;<\/span> t0<span class=\"token punctuation\">;<\/span><br \/>\n    State y <span class=\"token operator\">&#061;<\/span> y0<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> h <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>h_init<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> dir<span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> safety <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.9<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> min_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> max_factor <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">10.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> tiny <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token class-name\">numeric_limits<\/span><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    Trajectory traj<span class=\"token punctuation\">;<\/span><br \/>\n    size_t idx <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token comment\">\/\/ Emit initial sample if requested equals t0<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> times<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&#061;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> times<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&gt;&#061;<\/span> t<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>times<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token operator\">&#043;&#043;<\/span>idx<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> step <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> step <span class=\"token operator\">&lt;<\/span> max_steps <span class=\"token operator\">&amp;&amp;<\/span> idx <span class=\"token operator\">&lt;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>step<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ If we&#039;ve passed the last requested time, stop<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&gt;&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&lt;&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Adjust step to not skip beyond last requested time<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&gt;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">0.0<\/span> <span class=\"token operator\">&amp;&amp;<\/span> t <span class=\"token operator\">&#043;<\/span> h <span class=\"token operator\">&lt;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            h <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        State y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>array<span class=\"token operator\">&lt;<\/span>State<span class=\"token punctuation\">,<\/span><span class=\"token number\">7<\/span><span class=\"token operator\">&gt;<\/span> K<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token function\">runge_kutta_dopri5_step<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> h<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> err<span class=\"token punctuation\">,<\/span> K<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> err_norm <span class=\"token operator\">&#061;<\/span> normControl<br \/>\n            <span class=\"token operator\">?<\/span> <span class=\"token function\">two_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><br \/>\n            <span class=\"token operator\">:<\/span> <span class=\"token function\">inf_norm_scaled<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Step-size controller<\/span><br \/>\n        <span class=\"token keyword\">double<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&lt;&#061;<\/span> tiny<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> max_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> min_factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> safety <span class=\"token operator\">*<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">pow<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1.0<\/span> <span class=\"token operator\">\/<\/span> err_norm<span class=\"token punctuation\">,<\/span> <span class=\"token number\">0.2<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            factor <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">min<\/span><span class=\"token punctuation\">(<\/span>max_factor<span class=\"token punctuation\">,<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>min_factor<span class=\"token punctuation\">,<\/span> factor<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        h <span class=\"token operator\">*&#061;<\/span> factor<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>h <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Step size underflow&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err_norm <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1.0<\/span> <span class=\"token operator\">||<\/span> <span class=\"token operator\">!<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">isfinite<\/span><span class=\"token punctuation\">(<\/span>err_norm<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ rejected<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Accepted: emit samples at times within (t, t&#043;h]<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> dt <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&#8211;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">front<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ unused; keep h for s calc<\/span><br \/>\n        <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>idx <span class=\"token operator\">&lt;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> tau <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">[<\/span>idx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token comment\">\/\/ Check whether tau is within this step interval<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">bool<\/span> in_interval <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>dir <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token punctuation\">(<\/span>tau <span class=\"token operator\">&gt;<\/span> t <span class=\"token operator\">&amp;&amp;<\/span> tau <span class=\"token operator\">&lt;&#061;<\/span> t <span class=\"token operator\">&#043;<\/span> h<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span>tau <span class=\"token operator\">&lt;<\/span> t <span class=\"token operator\">&amp;&amp;<\/span> tau <span class=\"token operator\">&gt;&#061;<\/span> t <span class=\"token operator\">&#043;<\/span> h<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>in_interval<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> s <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>tau <span class=\"token operator\">&#8211;<\/span> t<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">\/<\/span> h<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ works both directions<\/span><br \/>\n            State yi <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">dopri5_dense_output<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>h<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">,<\/span> y_next<span class=\"token punctuation\">,<\/span> K<span class=\"token punctuation\">,<\/span> s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>tau<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">move<\/span><span class=\"token punctuation\">(<\/span>yi<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token operator\">&#043;&#043;<\/span>idx<span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><\/p>\n<p>        <span class=\"token comment\">\/\/ Advance to end of step<\/span><br \/>\n        t <span class=\"token operator\">&#043;&#061;<\/span> h<span class=\"token punctuation\">;<\/span><br \/>\n        y<span class=\"token punctuation\">.<\/span><span class=\"token function\">swap<\/span><span class=\"token punctuation\">(<\/span>y_next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>idx <span class=\"token operator\">!&#061;<\/span> times<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;Failed to sample all requested times before reaching max_steps&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> traj<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">struct<\/span> <span class=\"token class-name\">Options<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t0 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> t1 <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">5.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> h_init <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> atol <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1e-10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">double<\/span> rtol <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1e-10<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">bool<\/span> normControl <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">false<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ Octave default is off<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> refine <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">4<\/span><span class=\"token punctuation\">;<\/span>           <span class=\"token comment\">\/\/ Octave default is 4 for ode45<\/span><br \/>\n    <span class=\"token keyword\">int<\/span> max_steps <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">100000<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span> times<span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ explicit sample times; overrides refine when non-empty<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> Options <span class=\"token function\">parseArgs<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> Options<span class=\"token operator\">&amp;<\/span> defaults<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    Options opt <span class=\"token operator\">&#061;<\/span> defaults<span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">auto<\/span> starts_with <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> s<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token operator\">&amp;<\/span> p<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span> <span class=\"token keyword\">return<\/span> s<span class=\"token punctuation\">.<\/span><span class=\"token function\">rfind<\/span><span class=\"token punctuation\">(<\/span>p<span class=\"token punctuation\">,<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token operator\">&#061;&#061;<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> argc<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>string a <span class=\"token operator\">&#061;<\/span> argv<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>a <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;help&#034;<\/span> <span class=\"token operator\">||<\/span> a <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;-h&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Options:\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;t0&#061;VAL      start time (default 0)\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;t1&#061;VAL      end time (default 5)\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;h-init&#061;VAL  initial step size\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;atol&#061;VAL    absolute tolerance\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;rtol&#061;VAL    relative tolerance\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;normcontrol&#061;on|off norm control (default off)\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;refine&#061;N    points per step (default 4)\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;maxsteps&#061;N  max steps (default 100000)\\\\n&#034;<\/span><br \/>\n                      <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;  &#8211;times&#061;t0,t1,&#8230; explicit times to sample (overrides refine)\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">auto<\/span> eq <span class=\"token operator\">&#061;<\/span> a<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token char\">&#039;&#061;&#039;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>eq <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">continue<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string key <span class=\"token operator\">&#061;<\/span> a<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> eq<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string val <span class=\"token operator\">&#061;<\/span> a<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>eq<span class=\"token operator\">&#043;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;t0&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>t0 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;t1&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>t1 <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;h-init&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>h_init <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;atol&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>atol <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;rtol&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>rtol <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;refine&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>refine <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;maxsteps&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>max_steps <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stoi<\/span><span class=\"token punctuation\">(<\/span>val<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;normcontrol&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string v <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">;<\/span><br \/>\n                opt<span class=\"token punctuation\">.<\/span>normControl <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">(<\/span>v <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;on&#034;<\/span> <span class=\"token operator\">||<\/span> v <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;ON&#034;<\/span> <span class=\"token operator\">||<\/span> v <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;true&#034;<\/span> <span class=\"token operator\">||<\/span> v <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;1&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>key <span class=\"token operator\">&#061;&#061;<\/span> <span class=\"token string\">&#034;&#8211;times&#061;&#034;<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token comment\">\/\/ Parse comma-separated list of doubles<\/span><br \/>\n                opt<span class=\"token punctuation\">.<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">clear<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                size_t start <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">while<\/span> <span class=\"token punctuation\">(<\/span>start <span class=\"token operator\">&lt;&#061;<\/span> val<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    size_t comma <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">.<\/span><span class=\"token function\">find<\/span><span class=\"token punctuation\">(<\/span><span class=\"token char\">&#039;,&#039;<\/span><span class=\"token punctuation\">,<\/span> start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>string tok <span class=\"token operator\">&#061;<\/span> val<span class=\"token punctuation\">.<\/span><span class=\"token function\">substr<\/span><span class=\"token punctuation\">(<\/span>start<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span>comma<span class=\"token operator\">&#061;&#061;<\/span>std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span><span class=\"token operator\">?<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos <span class=\"token operator\">:<\/span> <span class=\"token punctuation\">(<\/span>comma<span class=\"token operator\">&#8211;<\/span>start<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>tok<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">push_back<\/span><span class=\"token punctuation\">(<\/span>std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">stod<\/span><span class=\"token punctuation\">(<\/span>tok<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>comma <span class=\"token operator\">&#061;&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>string<span class=\"token double-colon punctuation\">::<\/span>npos<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">break<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token keyword\">else<\/span> start <span class=\"token operator\">&#061;<\/span> comma <span class=\"token operator\">&#043;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cerr <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Invalid value for option: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> a <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">exit<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">.<\/span>refine <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> opt<span class=\"token punctuation\">.<\/span>refine <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> opt<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">main<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">int<\/span> argc<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">char<\/span><span class=\"token operator\">*<\/span><span class=\"token operator\">*<\/span> argv<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ Example: y&#039; &#061; -y, y(0) &#061; 1. Exact solution: y(t) &#061; exp(-t)<\/span><br \/>\n    DerivFunc f <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> <span class=\"token comment\">\/*t*\/<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> State<span class=\"token operator\">&amp;<\/span> dydt<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        dydt<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            dydt<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> <span class=\"token operator\">&#8211;<\/span>y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> State y0 <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">{<\/span><span class=\"token number\">1.0<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    Options defaults<span class=\"token punctuation\">;<\/span><br \/>\n    defaults<span class=\"token punctuation\">.<\/span>normControl <span class=\"token operator\">&#061;<\/span> <span class=\"token boolean\">true<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token comment\">\/\/ demo default on; Octave is off<\/span><br \/>\n    Options opt <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">parseArgs<\/span><span class=\"token punctuation\">(<\/span>argc<span class=\"token punctuation\">,<\/span> argv<span class=\"token punctuation\">,<\/span> defaults<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token comment\">\/\/ If explicit times provided, sample there; otherwise run default and optional refine<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">!<\/span>opt<span class=\"token punctuation\">.<\/span>times<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token comment\">\/\/ Expect first time equals opt.t0; if not, we start at first time.<\/span><br \/>\n            <span class=\"token keyword\">auto<\/span> traj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5_at_times<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t0<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>times<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>h_init<span class=\"token punctuation\">,<\/span><br \/>\n                                                              opt<span class=\"token punctuation\">.<\/span>atol<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>rtol<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>normControl<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;samples (first 5 of explicit times):\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">min<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>size_t<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>fixed <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">setprecision<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n            <span class=\"token comment\">\/\/ Also print last sample<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">setprecision<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">16<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;y(&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;) &#061; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">back<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">else<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> State y1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t0<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t1<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>h_init<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>atol<span class=\"token punctuation\">,<\/span><br \/>\n                                                          opt<span class=\"token punctuation\">.<\/span>rtol<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>normControl<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> exact <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">exp<\/span><span class=\"token punctuation\">(<\/span><span class=\"token operator\">&#8211;<\/span>opt<span class=\"token punctuation\">.<\/span>t1<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">setprecision<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">16<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;y(&#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> opt<span class=\"token punctuation\">.<\/span>t1 <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;) &#061; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> y1<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;exact &#061; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> exact <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;abs err &#061; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">abs<\/span><span class=\"token punctuation\">(<\/span>y1<span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#8211;<\/span> exact<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">.<\/span>refine <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                <span class=\"token keyword\">auto<\/span> traj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5_refined<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t0<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t1<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>h_init<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>atol<span class=\"token punctuation\">,<\/span><br \/>\n                                                                 opt<span class=\"token punctuation\">.<\/span>rtol<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>normControl<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>refine<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;samples (first 5):\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token generic-function\"><span class=\"token function\">min<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span>size_t<span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                    std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span>fixed <span class=\"token operator\">&lt;&lt;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">setprecision<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">8<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token number\">0<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token punctuation\">}<\/span><br \/>\n                <span class=\"token comment\">\/\/ Verify Octave&#039;s length relationship: len_R &#061; R*len_1 &#8211; (R-1)<\/span><br \/>\n                <span class=\"token keyword\">auto<\/span> coarse <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5_refined<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t0<span class=\"token punctuation\">,<\/span> y0<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>t1<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>h_init<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>atol<span class=\"token punctuation\">,<\/span><br \/>\n                                                                   opt<span class=\"token punctuation\">.<\/span>rtol<span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>normControl<span class=\"token punctuation\">,<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">,<\/span> opt<span class=\"token punctuation\">.<\/span>max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> size_t lenR <span class=\"token operator\">&#061;<\/span> traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                <span class=\"token keyword\">const<\/span> size_t len1 <span class=\"token operator\">&#061;<\/span> coarse<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n                std<span class=\"token double-colon punctuation\">::<\/span>cout <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;length refine &#061; &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> opt<span class=\"token punctuation\">.<\/span>refine <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> lenR <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;, expected &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span><br \/>\n                    <span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">.<\/span>refine<span class=\"token operator\">*<\/span>len1 <span class=\"token operator\">&#8211;<\/span> <span class=\"token punctuation\">(<\/span>opt<span class=\"token punctuation\">.<\/span>refine<span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> std<span class=\"token double-colon punctuation\">::<\/span>exception<span class=\"token operator\">&amp;<\/span> e<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>cerr <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;Error: &#034;<\/span> <span class=\"token operator\">&lt;&lt;<\/span> e<span class=\"token punctuation\">.<\/span><span class=\"token function\">what<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">&lt;&lt;<\/span> <span class=\"token string\">&#034;\\\\n&#034;<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">static<\/span> <span class=\"token keyword\">double<\/span> <span class=\"token function\">two_norm_scaled<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> err<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y_next<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token comment\">\/\/ Matches two_norm_scaled with NormControl &#061;&#061; true:<\/span><br \/>\n    <span class=\"token comment\">\/\/ sc &#061; max(AbsTol(:), RelTol * max(||y||_2, ||y_next||_2))<\/span><br \/>\n    <span class=\"token comment\">\/\/ err_norm &#061; ||err||_2 \/ sc<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">||<\/span> err<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> y_next<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">throw<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">runtime_error<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">&#034;State size mismatch&#034;<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n    <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">.<\/span><span class=\"token function\">empty<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><\/p>\n<p>    <span class=\"token keyword\">auto<\/span> norm2 <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> v<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">long<\/span> <span class=\"token keyword\">double<\/span> s <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0.0L<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> vi <span class=\"token operator\">:<\/span> v<span class=\"token punctuation\">)<\/span> s <span class=\"token operator\">&#043;&#061;<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>vi<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">*<\/span> <span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">long<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>vi<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">sqrt<\/span><span class=\"token punctuation\">(<\/span><span class=\"token generic-function\"><span class=\"token function\">static_cast<\/span><span class=\"token generic class-name\"><span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span><\/span><\/span><span class=\"token punctuation\">(<\/span>s<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p>    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> sc <span class=\"token operator\">&#061;<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span>atol<span class=\"token punctuation\">,<\/span> rtol <span class=\"token operator\">*<\/span> std<span class=\"token double-colon punctuation\">::<\/span><span class=\"token function\">max<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">norm2<\/span><span class=\"token punctuation\">(<\/span>y<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token function\">norm2<\/span><span class=\"token punctuation\">(<\/span>y_next<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span> e2 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">norm2<\/span><span class=\"token punctuation\">(<\/span>err<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token keyword\">return<\/span> <span class=\"token punctuation\">(<\/span>sc <span class=\"token operator\">&gt;<\/span> <span class=\"token number\">0.0<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">?<\/span> <span class=\"token punctuation\">(<\/span>e2 <span class=\"token operator\">\/<\/span> sc<span class=\"token punctuation\">)<\/span> <span class=\"token operator\">:<\/span> e2<span class=\"token punctuation\">;<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/\/ &#8212; C API wrappers (extern &#034;C&#034;) &#8212;<\/span><br \/>\n<span class=\"token keyword\">extern<\/span> <span class=\"token string\">&#034;C&#034;<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n<span class=\"token keyword\">typedef<\/span> <span class=\"token keyword\">void<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token operator\">*<\/span>ode45_deriv_cb<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> dydt<span class=\"token punctuation\">,<\/span> size_t n<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">ode45_integrate_final<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t n<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> t1<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> norm_control<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> max_steps<span class=\"token punctuation\">,<\/span><br \/>\n                          ode45_deriv_cb cb<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y_out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        State <span class=\"token function\">y0v<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> y0v<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y0<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        DerivFunc f <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>cb<span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> State<span class=\"token operator\">&amp;<\/span> dydt<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            dydt<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">cb<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> dydt<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        State y1 <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> t0<span class=\"token punctuation\">,<\/span> y0v<span class=\"token punctuation\">,<\/span> t1<span class=\"token punctuation\">,<\/span> h_init<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">,<\/span> norm_control <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> y_out<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y1<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token keyword\">int<\/span> <span class=\"token function\">ode45_integrate_times<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t0<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y0<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t n<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">const<\/span> <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> times<span class=\"token punctuation\">,<\/span><br \/>\n                          size_t m<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> h_init<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> atol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span> rtol<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> normControl<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">int<\/span> max_steps<span class=\"token punctuation\">,<\/span><br \/>\n                          ode45_deriv_cb cb<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">void<\/span><span class=\"token operator\">*<\/span> ctx<span class=\"token punctuation\">,<\/span><br \/>\n                          <span class=\"token keyword\">double<\/span><span class=\"token operator\">*<\/span> y_out<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n    <span class=\"token keyword\">try<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        State <span class=\"token function\">y0v<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> y0v<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> y0<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        std<span class=\"token double-colon punctuation\">::<\/span>vector<span class=\"token operator\">&lt;<\/span><span class=\"token keyword\">double<\/span><span class=\"token operator\">&gt;<\/span> <span class=\"token function\">tv<\/span><span class=\"token punctuation\">(<\/span>m<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> m<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> tv<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> times<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        DerivFunc f <span class=\"token operator\">&#061;<\/span> <span class=\"token punctuation\">[<\/span>cb<span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">double<\/span> t<span class=\"token punctuation\">,<\/span> <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> y<span class=\"token punctuation\">,<\/span> State<span class=\"token operator\">&amp;<\/span> dydt<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            dydt<span class=\"token punctuation\">.<\/span><span class=\"token function\">resize<\/span><span class=\"token punctuation\">(<\/span>n<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token function\">cb<\/span><span class=\"token punctuation\">(<\/span>t<span class=\"token punctuation\">,<\/span> y<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> dydt<span class=\"token punctuation\">.<\/span><span class=\"token function\">data<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span> n<span class=\"token punctuation\">,<\/span> ctx<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        Trajectory traj <span class=\"token operator\">&#061;<\/span> <span class=\"token function\">integrate_runge_kutta_dopri5_at_times<\/span><span class=\"token punctuation\">(<\/span>f<span class=\"token punctuation\">,<\/span> t0<span class=\"token punctuation\">,<\/span> y0v<span class=\"token punctuation\">,<\/span> tv<span class=\"token punctuation\">,<\/span> h_init<span class=\"token punctuation\">,<\/span> atol<span class=\"token punctuation\">,<\/span> rtol<span class=\"token punctuation\">,<\/span> normControl <span class=\"token operator\">!&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">,<\/span> max_steps<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>traj<span class=\"token punctuation\">.<\/span>t<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> m <span class=\"token operator\">||<\/span> traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">.<\/span><span class=\"token function\">size<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">!&#061;<\/span> m<span class=\"token punctuation\">)<\/span> <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">2<\/span><span class=\"token punctuation\">;<\/span><br \/>\n        <span class=\"token comment\">\/\/ Row-major blocks: for each time i, copy n entries<\/span><br \/>\n        <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t i <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> m<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>i<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n            <span class=\"token keyword\">const<\/span> State<span class=\"token operator\">&amp;<\/span> yi <span class=\"token operator\">&#061;<\/span> traj<span class=\"token punctuation\">.<\/span>y<span class=\"token punctuation\">[<\/span>i<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span>size_t j <span class=\"token operator\">&#061;<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> j <span class=\"token operator\">&lt;<\/span> n<span class=\"token punctuation\">;<\/span> <span class=\"token operator\">&#043;&#043;<\/span>j<span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n                y_out<span class=\"token punctuation\">[<\/span>i<span class=\"token operator\">*<\/span>n <span class=\"token operator\">&#043;<\/span> j<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">&#061;<\/span> yi<span class=\"token punctuation\">[<\/span>j<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">;<\/span><br \/>\n            <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token punctuation\">}<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">catch<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">.<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span><br \/>\n        <span class=\"token keyword\">return<\/span> <span class=\"token operator\">&#8211;<\/span><span class=\"token number\">1<\/span><span class=\"token punctuation\">;<\/span><br \/>\n    <span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><br \/>\n<span class=\"token punctuation\">}<\/span><\/p>\n<p><span class=\"token comment\">\/*<br \/>\ny(5) &#061; 0.00673794718173955<br \/>\nexact &#061; 0.006737946999085467<br \/>\nabs err &#061; 1.98847773490845e-011<br \/>\nsamples (first 5):<br \/>\n0.00000000: 1.00000000<br \/>\n0.00927251: 0.99077034<br \/>\n0.01854503: 0.98162587<br \/>\n0.02781754: 0.97256580<br \/>\n0.03709006: 0.96358935<br \/>\nlength refine&#061;4: 349, expected 349<br \/>\n*\/<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>#include #ifdef __cplusplus<br \/>\nextern \\&#8221;C\\&#8221; {<br \/>\n#endif\/\/ C callback for derivatives: fills dydt of length n given y of length n at time t.<br \/>\ntypedef void (*ode45_deriv_cb)(double t, const double* y, double* dydt, size_t n, void* ctx);\/\/ In<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[55,1284,190,427],"topic":[],"class_list":["post-106719","post","type-post","status-publish","format-standard","hentry","category-server","tag-c","tag-matlab","tag-190","tag-427"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.wsisp.com\/helps\/106719.html\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"og:description\" content=\"#include #ifdef __cplusplus extern &quot;C&quot; { #endif\/\/ C callback for derivatives: fills dydt of length n given y of length n at time t. typedef void (*ode45_deriv_cb)(double t, const double* y, double* dydt, size_t n, void* ctx);\/\/ In\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.wsisp.com\/helps\/106719.html\" \/>\n<meta property=\"og:site_name\" content=\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-17T22:40:32+00:00\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/106719.html\",\"url\":\"https:\/\/www.wsisp.com\/helps\/106719.html\",\"name\":\"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"isPartOf\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\"},\"datePublished\":\"2026-09-17T22:40:32+00:00\",\"dateModified\":\"2026-09-17T22:40:32+00:00\",\"author\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.wsisp.com\/helps\/106719.html#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.wsisp.com\/helps\/106719.html\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/106719.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.wsisp.com\/helps\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#website\",\"url\":\"https:\/\/www.wsisp.com\/helps\/\",\"name\":\"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3\",\"description\":\"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"contentUrl\":\"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery\",\"caption\":\"admin\"},\"sameAs\":[\"http:\/\/wp.wsisp.com\"],\"url\":\"https:\/\/www.wsisp.com\/helps\/author\/admin\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.wsisp.com\/helps\/106719.html","og_locale":"zh_CN","og_type":"article","og_title":"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","og_description":"#include #ifdef __cplusplus extern \"C\" { #endif\/\/ C callback for derivatives: fills dydt of length n given y of length n at time t. typedef void (*ode45_deriv_cb)(double t, const double* y, double* dydt, size_t n, void* ctx);\/\/ In","og_url":"https:\/\/www.wsisp.com\/helps\/106719.html","og_site_name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","article_published_time":"2026-09-17T22:40:32+00:00","author":"admin","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"18 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.wsisp.com\/helps\/106719.html","url":"https:\/\/www.wsisp.com\/helps\/106719.html","name":"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd - \u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","isPartOf":{"@id":"https:\/\/www.wsisp.com\/helps\/#website"},"datePublished":"2026-09-17T22:40:32+00:00","dateModified":"2026-09-17T22:40:32+00:00","author":{"@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41"},"breadcrumb":{"@id":"https:\/\/www.wsisp.com\/helps\/106719.html#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.wsisp.com\/helps\/106719.html"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.wsisp.com\/helps\/106719.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.wsisp.com\/helps"},{"@type":"ListItem","position":2,"name":"C++\u4ee3\u7801\u5b9e\u73b0MATLAB\u4e2d\u7684ode45\u51fd\u6570\u529f\u80fd"}]},{"@type":"WebSite","@id":"https:\/\/www.wsisp.com\/helps\/#website","url":"https:\/\/www.wsisp.com\/helps\/","name":"\u7f51\u7855\u4e92\u8054\u5e2e\u52a9\u4e2d\u5fc3","description":"\u9999\u6e2f\u670d\u52a1\u5668_\u9999\u6e2f\u4e91\u670d\u52a1\u5668\u8d44\u8baf_\u670d\u52a1\u5668\u5e2e\u52a9\u6587\u6863_\u670d\u52a1\u5668\u6559\u7a0b","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.wsisp.com\/helps\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/358e386c577a3ab51c4493330a20ad41","name":"admin","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.wsisp.com\/helps\/#\/schema\/person\/image\/","url":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","contentUrl":"https:\/\/gravatar.wp-china-yes.net\/avatar\/?s=96&d=mystery","caption":"admin"},"sameAs":["http:\/\/wp.wsisp.com"],"url":"https:\/\/www.wsisp.com\/helps\/author\/admin"}]}},"_links":{"self":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/106719","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/comments?post=106719"}],"version-history":[{"count":0,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/posts\/106719\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/media?parent=106719"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/categories?post=106719"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/tags?post=106719"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/www.wsisp.com\/helps\/wp-json\/wp\/v2\/topic?post=106719"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}