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;
27 std::shared_ptr<typename base_type::sde_problem_type> problem,
28 std::shared_ptr<typename base_type::wiener_process_type> wiener =
nullptr,
29 int max_iterations = 10,
30 value_type tolerance = 1e-8)
32 , max_iterations_(max_iterations)
33 , tolerance_(tolerance) {}
35 void step(state_type& state, time_type dt)
override {
44 this->wiener_->generate_increment(dW, dt);
47 this->problem_->diffusion(this->current_time_, state, diffusion_term);
48 this->problem_->apply_noise(this->current_time_, state, diffusion_term, dW);
51 for (
size_t i = 0; i < state.size(); ++i) {
52 auto state_it = state.begin();
53 auto x_new_it = x_new.begin();
54 auto diffusion_it = diffusion_term.begin();
56 x_new_it[i] = state_it[i] + diffusion_it[i];
60 for (
int iter = 0; iter < max_iterations_; ++iter) {
62 for (
size_t i = 0; i < state.size(); ++i) {
63 auto x_new_it = x_new.begin();
64 auto x_old_it = x_old.begin();
65 x_old_it[i] = x_new_it[i];
69 this->problem_->drift(this->current_time_ + dt, x_old, drift_term);
72 value_type max_change = 0;
73 for (
size_t i = 0; i < state.size(); ++i) {
74 auto state_it = state.begin();
75 auto x_new_it = x_new.begin();
76 auto x_old_it = x_old.begin();
77 auto drift_it = drift_term.begin();
78 auto diffusion_it = diffusion_term.begin();
80 value_type new_val = state_it[i] + drift_it[i] * dt + diffusion_it[i];
81 value_type change = std::abs(new_val - x_old_it[i]);
82 max_change = std::max<value_type>(max_change, change);
83 x_new_it[i] = new_val;
87 if (max_change < tolerance_) {
93 for (
size_t i = 0; i < state.size(); ++i) {
94 auto state_it = state.begin();
95 auto x_new_it = x_new.begin();
96 state_it[i] = x_new_it[i];
99 this->advance_time(dt);
102 std::string name()
const override {
103 return "Implicit Euler-Maruyama";
106 void set_iteration_parameters(
int max_iterations, value_type tolerance) {
107 max_iterations_ = max_iterations;
108 tolerance_ = tolerance;
113 value_type tolerance_;
Implicit Euler-Maruyama method.