15#include <janus/math/Arithmetic.hpp>
16#include <janus/math/IntegratorStep.hpp>
17#include <janus/math/Logic.hpp>
46 explicit RK45Integrator(Scalar abs_tol = Scalar{1e-6}, Scalar rel_tol = Scalar{1e-6})
47 : abs_tol_(abs_tol), rel_tol_(rel_tol) {}
57 auto result = janus::rk45_step(f, x, t, dt);
76 Scalar t, Scalar dt)
override {
77 Scalar current_dt = dt;
80 constexpr int max_attempts = 20;
81 for (
int attempt = 0; attempt < max_attempts; ++attempt) {
83 auto result = janus::rk45_step(f, x, t, current_dt);
86 Scalar tol = ComputeTolerance(x, result.y5);
89 bool accepted = LessThanOrEqual(result.error, tol);
92 stats_.accepted_steps++;
97 stats_.rejected_steps++;
100 Scalar dt_new =
SuggestDt(current_dt, result.error, tol);
103 if constexpr (std::is_same_v<Scalar, double>) {
104 if (dt_new <= min_dt_) {
113 auto result = janus::rk45_step(f, x, t, current_dt);
120 [[nodiscard]] Scalar
GetAbsTol()
const override {
return abs_tol_; }
121 [[nodiscard]] Scalar
GetRelTol()
const override {
return rel_tol_; }
123 [[nodiscard]] std::string
Name()
const override {
return "RK45"; }
124 [[nodiscard]]
int Order()
const override {
return 5; }
132 [[nodiscard]] Scalar
GetMinDt()
const {
return min_dt_; }
133 [[nodiscard]] Scalar
GetMaxDt()
const {
return max_dt_; }
143 [[nodiscard]] Scalar
SuggestDt(Scalar dt, Scalar error, Scalar tol)
const {
146 Scalar ratio = tol / (error + Scalar{1e-15});
147 Scalar factor = safety_ * janus::pow(ratio, Scalar{0.2});
150 factor = janus::max(Scalar{0.1}, janus::min(Scalar{5.0}, factor));
152 Scalar dt_new = dt * factor;
155 return janus::max(min_dt_, janus::min(max_dt_, dt_new));
172 return total > 0 ?
static_cast<double>(
accepted_steps) /
static_cast<double>(total)
183 Scalar min_dt_{1e-10};
193 [[nodiscard]] Scalar ComputeTolerance(
const JanusVector<Scalar> &x,
194 const JanusVector<Scalar> &x_new)
const {
195 Scalar max_norm = Scalar{0};
196 for (Eigen::Index i = 0; i < x.size(); ++i) {
197 Scalar xi_abs = janus::abs(x[i]);
198 Scalar xi_new_abs = janus::abs(x_new[i]);
199 max_norm = janus::max(max_norm, janus::max(xi_abs, xi_new_abs));
201 return abs_tol_ + rel_tol_ * max_norm;
207 [[nodiscard]]
bool LessThanOrEqual(Scalar a, Scalar b)
const {
210 if constexpr (std::is_same_v<Scalar, double>) {
Consolidated error handling for Icarus.
Abstract interface for numerical integrators.
Interface for adaptive step integrators.
Definition Integrator.hpp:101
std::function< JanusVector< Scalar >(Scalar t, const JanusVector< Scalar > &x)> DerivativeFunc
Derivative function signature.
Definition Integrator.hpp:54
Scalar GetMinDt() const
Definition RK45Integrator.hpp:132
IntegratorType Type() const override
Get integrator type.
Definition RK45Integrator.hpp:125
const Statistics & GetStatistics() const
Definition RK45Integrator.hpp:177
RK45Integrator(Scalar abs_tol=Scalar{1e-6}, Scalar rel_tol=Scalar{1e-6})
Construct with default tolerances.
Definition RK45Integrator.hpp:46
Scalar GetRelTol() const override
Get current relative tolerance.
Definition RK45Integrator.hpp:121
void ResetStatistics()
Definition RK45Integrator.hpp:178
void SetAbsTol(Scalar tol) override
Set absolute tolerance.
Definition RK45Integrator.hpp:118
std::string Name() const override
Get integrator name for logging.
Definition RK45Integrator.hpp:123
Scalar GetAbsTol() const override
Get current absolute tolerance.
Definition RK45Integrator.hpp:120
AdaptiveStepResult< Scalar > AdaptiveStep(const DerivativeFunc &f, const JanusVector< Scalar > &x, Scalar t, Scalar dt) override
Adaptive step with automatic error control.
Definition RK45Integrator.hpp:75
void SetRelTol(Scalar tol) override
Set relative tolerance.
Definition RK45Integrator.hpp:119
void SetSafetyFactor(Scalar factor)
Definition RK45Integrator.hpp:130
void SetMaxDt(Scalar max_dt)
Definition RK45Integrator.hpp:129
Scalar GetMaxDt() const
Definition RK45Integrator.hpp:133
void SetMinDt(Scalar min_dt)
Definition RK45Integrator.hpp:128
Scalar SuggestDt(Scalar dt, Scalar error, Scalar tol) const
Suggest next step size based on error.
Definition RK45Integrator.hpp:143
JanusVector< Scalar > Step(const DerivativeFunc &f, const JanusVector< Scalar > &x, Scalar t, Scalar dt) override
Fixed-step interface (uses requested dt directly).
Definition RK45Integrator.hpp:55
int Order() const override
Get integrator order (for error analysis).
Definition RK45Integrator.hpp:124
Definition AggregationTypes.hpp:13
IntegratorType
Available integrator methods.
Definition IntegratorTypes.hpp:27
@ RK45
Dormand-Prince adaptive (5th order, 7 evals) - janus::rk45_step.
Definition IntegratorTypes.hpp:31
Result from adaptive step integrators.
Definition Integrator.hpp:26
Statistics for adaptive stepping.
Definition RK45Integrator.hpp:161
void Reset()
Definition RK45Integrator.hpp:165
std::size_t accepted_steps
Definition RK45Integrator.hpp:162
std::size_t rejected_steps
Definition RK45Integrator.hpp:163
double AcceptanceRate() const
Definition RK45Integrator.hpp:170