25 using state_type =
typename base_type::state_type;
26 using time_type =
typename base_type::time_type;
27 using value_type =
typename base_type::value_type;
30 using diffusion_derivative_function = std::function<void(time_type,
const state_type&, state_type&)>;
32 explicit MilsteinIntegrator(std::shared_ptr<typename base_type::sde_problem_type> problem,
33 diffusion_derivative_function diffusion_derivative,
34 std::shared_ptr<typename base_type::wiener_process_type> wiener =
nullptr)
36 , diffusion_derivative_(std::move(diffusion_derivative)) {}
38 void step(state_type& state, time_type dt)
override {
46 this->wiener_->generate_increment(dW, dt);
49 this->problem_->drift(this->current_time_, state, drift_term);
52 this->problem_->diffusion(this->current_time_, state, diffusion_term);
55 diffusion_derivative_(this->current_time_, state, diffusion_deriv_term);
58 this->problem_->apply_noise(this->current_time_, state, diffusion_term, dW);
61 for (
size_t i = 0; i < state.size(); ++i) {
62 auto state_it = state.begin();
63 auto drift_it = drift_term.begin();
64 auto diffusion_it = diffusion_term.begin();
65 auto diffusion_deriv_it = diffusion_deriv_term.begin();
66 auto dW_it = dW.begin();
68 value_type dW_squared = dW_it[i] * dW_it[i];
69 value_type correction =
static_cast<value_type
>(0.5) * diffusion_it[i] * diffusion_deriv_it[i] * (dW_squared - dt);
71 state_it[i] += drift_it[i] * dt + diffusion_it[i] + correction;
74 this->advance_time(dt);
77 std::string name()
const override {
82 diffusion_derivative_function diffusion_derivative_;