23 using state_type =
typename base_type::state_type;
24 using time_type =
typename base_type::time_type;
25 using value_type =
typename base_type::value_type;
26 using system_function =
typename base_type::system_function;
29 time_type rtol =
static_cast<time_type
>(1e-3),
30 time_type atol =
static_cast<time_type
>(1e-6))
31 :
base_type(std::move(sys), rtol, atol) {}
33 void step(state_type& state, time_type dt)
override {
34 adaptive_step(state, dt);
37 time_type adaptive_step(state_type& state, time_type dt)
override {
38 time_type t = this->current_time_;
51 for (std::size_t i = 0; i < state.size(); ++i) {
52 y_new[i] = state[i] / (1.0 + h);
57 for (std::size_t i = 0; i < state.size(); ++i) {
59 time_type forward_euler = state[i] * (1.0 - h);
60 error[i] = std::abs(y_new[i] - forward_euler);
64 time_type error_norm = 0.0;
65 for (std::size_t i = 0; i < error.size(); ++i) {
66 time_type scale = this->atol_ + this->rtol_ * std::abs(y_new[i]);
67 time_type scaled_error = error[i] / scale;
68 error_norm += scaled_error * scaled_error;
70 error_norm = std::sqrt(error_norm / error.size());
73 if (error_norm <= 1.0) {
76 this->advance_time(h);
79 if (error_norm > 0.0) {
80 time_type factor =
static_cast<time_type
>(0.9) * std::pow(error_norm,
static_cast<time_type
>(-0.5));
81 if (factor <
static_cast<time_type
>(0.2)) factor =
static_cast<time_type
>(0.2);
82 if (factor >
static_cast<time_type
>(5.0)) factor =
static_cast<time_type
>(5.0);
87 time_type factor =
static_cast<time_type
>(0.9) * std::pow(error_norm,
static_cast<time_type
>(-0.5));
88 if (factor <
static_cast<time_type
>(0.2)) factor =
static_cast<time_type
>(0.2);
89 if (factor >
static_cast<time_type
>(1.0)) factor =
static_cast<time_type
>(1.0);
93 return adaptive_step(state, h);