65 FloatingPoint h, FloatingPoint epsilon_h) {
69 auto ws =
omega(info, s).eval();
70 auto gs =
gamma(info, s).eval();
71 auto omega_analytic =
eval(info.alloc_,
omega(info, t));
72 auto omega_estimate = info.L() * ws;
73 auto gamma_analytic =
eval(info.alloc_,
gamma(info, t));
74 auto gamma_estimate = info.L() * gs;
75 FloatingPoint max_omega_err
76 = (((omega_estimate - omega_analytic).array() / omega_analytic.array())
79 FloatingPoint max_gamma_err
80 = (((gamma_estimate - gamma_analytic).array() / gamma_analytic.array())
83 FloatingPoint max_err = std::max(max_omega_err, max_gamma_err);
84 if (max_err <= epsilon_h) {
85 if (info.p_ != info.n_) {
87 ws =
omega(info, xn_scaled);
88 gs =
gamma(info, xn_scaled);
90 return std::make_tuple(h, ws, gs);
92 auto h_scaling =
static_cast<FloatingPoint
>(std::min(
93 0.7, 0.9 * std::pow(epsilon_h / max_err, (1.0 / (info.p_ - 1.0)))));
auto choose_osc_stepsize(SolverInfo &&info, FloatingPoint x0, FloatingPoint h, FloatingPoint epsilon_h)
Chooses an appropriate step size for the Riccati step based on the accuracy of Chebyshev interpolatio...