DiffEq - Modern C++ ODE Integration Library 1.0.0
High-performance C++ library for solving ODEs with async signal processing
Loading...
Searching...
No Matches
sosri.hpp
1#pragma once
2
3#include <sde/sde_base.hpp>
4#include <core/state_creator.hpp>
5#include <cmath>
6
7namespace diffeq {
8
15template<system_state StateType>
16class SOSRIIntegrator : public SRIIntegrator<StateType> {
17public:
19
20 explicit SOSRIIntegrator(std::shared_ptr<typename base_type::sde_problem_type> problem,
21 std::shared_ptr<typename base_type::wiener_process_type> wiener = nullptr)
22 : base_type(problem, wiener, create_sosri_tableau()) {}
23
24 std::string name() const override {
25 return "SOSRI (Stability-Optimized SRI for General Itô SDEs)";
26 }
27
28private:
29 static typename base_type::tableau_type create_sosri_tableau() {
30 typename base_type::tableau_type tableau;
31 tableau.stages = 3;
32 tableau.order = static_cast<typename base_type::value_type>(1.5);
33
34 // SOSRI drift coefficients (3-stage, stability-optimized)
35 tableau.A0 = {{0, 0, 0},
36 {static_cast<typename base_type::value_type>(0.4), 0, 0},
37 {static_cast<typename base_type::value_type>(0.1),
38 static_cast<typename base_type::value_type>(0.5), 0}};
39 tableau.A1 = {{0, 0, 0},
40 {static_cast<typename base_type::value_type>(0.4), 0, 0},
41 {static_cast<typename base_type::value_type>(0.1),
42 static_cast<typename base_type::value_type>(0.5), 0}};
43 tableau.c0 = {0, static_cast<typename base_type::value_type>(0.4),
44 static_cast<typename base_type::value_type>(0.6)};
45 tableau.alpha = {static_cast<typename base_type::value_type>(1.0/6.0),
46 static_cast<typename base_type::value_type>(2.0/3.0),
47 static_cast<typename base_type::value_type>(1.0/6.0)};
48
49 // SOSRI diffusion coefficients
50 tableau.B0 = {{0, 0, 0},
51 {static_cast<typename base_type::value_type>(0.4), 0, 0},
52 {static_cast<typename base_type::value_type>(0.1),
53 static_cast<typename base_type::value_type>(0.5), 0}};
54 tableau.B1 = {{0, 0, 0},
55 {static_cast<typename base_type::value_type>(0.4), 0, 0},
56 {static_cast<typename base_type::value_type>(0.1),
57 static_cast<typename base_type::value_type>(0.5), 0}};
58 tableau.c1 = {0, static_cast<typename base_type::value_type>(0.4),
59 static_cast<typename base_type::value_type>(0.6)};
60 tableau.beta1 = {static_cast<typename base_type::value_type>(1.0/6.0),
61 static_cast<typename base_type::value_type>(2.0/3.0),
62 static_cast<typename base_type::value_type>(1.0/6.0)};
63 tableau.beta2 = {0, static_cast<typename base_type::value_type>(0.3),
64 static_cast<typename base_type::value_type>(0.7)};
65 tableau.beta3 = {0, static_cast<typename base_type::value_type>(0.2),
66 static_cast<typename base_type::value_type>(0.8)};
67 tableau.beta4 = {0, static_cast<typename base_type::value_type>(0.1),
68 static_cast<typename base_type::value_type>(0.05)};
69
70 return tableau;
71 }
72};
73
74} // namespace diffeq
SOSRI (Stability-Optimized SRI) integrator.
Definition sosri.hpp:16
SRI (Stochastic Runge-Kutta for general Itô SDEs) integrator.
Definition sri.hpp:44