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;
26 explicit SRI1Integrator(std::shared_ptr<typename base_type::sde_problem_type> problem,
27 std::shared_ptr<typename base_type::wiener_process_type> wiener =
nullptr)
30 void step(state_type& state, time_type dt)
override {
40 this->wiener_->generate_increment(dW, dt);
42 time_type t = this->current_time_;
43 value_type sqrt_dt = std::sqrt(
static_cast<value_type
>(dt));
46 this->problem_->drift(t, state, k1);
47 this->problem_->diffusion(t, state, g1);
50 for (
size_t i = 0; i < state.size(); ++i) {
51 auto state_it = state.begin();
52 auto k1_it = k1.begin();
53 auto g1_it = g1.begin();
54 auto temp_it = temp_state.begin();
55 auto dW_it = dW.begin();
57 temp_it[i] = state_it[i] + k1_it[i] * dt + g1_it[i] * sqrt_dt;
61 this->problem_->drift(t + dt, temp_state, k2);
62 this->problem_->diffusion(t + dt, temp_state, g2);
68 for (
size_t i = 0; i < state.size(); ++i) {
69 auto g1_it = g1.begin();
70 auto g2_it = g2.begin();
71 auto g1_noise_it = g1_noise.begin();
72 auto g2_noise_it = g2_noise.begin();
74 g1_noise_it[i] = g1_it[i];
75 g2_noise_it[i] = g2_it[i];
78 this->problem_->apply_noise(t, state, g1_noise, dW);
79 this->problem_->apply_noise(t + dt, temp_state, g2_noise, dW);
82 for (
size_t i = 0; i < state.size(); ++i) {
83 auto state_it = state.begin();
84 auto k1_it = k1.begin();
85 auto k2_it = k2.begin();
86 auto g1_noise_it = g1_noise.begin();
87 auto g2_noise_it = g2_noise.begin();
89 state_it[i] += (k1_it[i] + k2_it[i]) * dt *
static_cast<value_type
>(0.5) +
90 (g1_noise_it[i] + g2_noise_it[i]) *
static_cast<value_type
>(0.5);
93 this->advance_time(dt);
96 std::string name()
const override {
97 return "SRI1 (Stochastic Runge-Kutta)";