22 using state_type =
typename base_type::state_type;
23 using time_type =
typename base_type::time_type;
24 using value_type =
typename base_type::value_type;
25 using system_function =
typename base_type::system_function;
30 void step(state_type& state, time_type dt)
override {
39 this->sys_(this->current_time_, state, k1);
42 for (std::size_t i = 0; i < state.size(); ++i) {
43 auto state_it = state.begin();
44 auto k1_it = k1.begin();
45 auto temp_it = temp_state.begin();
47 temp_it[i] = state_it[i] + dt * k1_it[i] /
static_cast<time_type
>(2);
49 this->sys_(this->current_time_ + dt /
static_cast<time_type
>(2), temp_state, k2);
52 for (std::size_t i = 0; i < state.size(); ++i) {
53 auto state_it = state.begin();
54 auto k2_it = k2.begin();
55 auto temp_it = temp_state.begin();
57 temp_it[i] = state_it[i] + dt * k2_it[i] /
static_cast<time_type
>(2);
59 this->sys_(this->current_time_ + dt /
static_cast<time_type
>(2), temp_state, k3);
62 for (std::size_t i = 0; i < state.size(); ++i) {
63 auto state_it = state.begin();
64 auto k3_it = k3.begin();
65 auto temp_it = temp_state.begin();
67 temp_it[i] = state_it[i] + dt * k3_it[i];
69 this->sys_(this->current_time_ + dt, temp_state, k4);
72 for (std::size_t i = 0; i < state.size(); ++i) {
73 auto state_it = state.begin();
74 auto k1_it = k1.begin();
75 auto k2_it = k2.begin();
76 auto k3_it = k3.begin();
77 auto k4_it = k4.begin();
79 state_it[i] = state_it[i] + dt * (k1_it[i] +
static_cast<time_type
>(2) * k2_it[i] +
80 static_cast<time_type
>(2) * k3_it[i] + k4_it[i]) /
static_cast<time_type
>(6);
83 this->advance_time(dt);