Lodestar
An integrated real-time control package in C++
BogackiShampine.hpp
1 //
2 // Created by Hamza El-Kebir on 6/18/21.
3 //
4 
5 #ifndef LODESTAR_BOGACKISHAMPINE_HPP
6 #define LODESTAR_BOGACKISHAMPINE_HPP
7 
8 #include "ButcherTableau.hpp"
9 
10 namespace ls {
11  namespace primitives {
12  namespace detail {
13 
15  friend class BogackiShampine;
16 
17  protected:
19  {
20  btSimple.setNode<0>(1.0 / 2.0);
21  btSimple.setCoefficient<0, 0>(1.0 / 2.0);
22 
23  btSimple.setNode<1>(3.0 / 4.0);
24  btSimple.setCoefficient<1, 0>(0.0);
25  btSimple.setCoefficient<1, 1>(3.0 / 4.0);
26 
27  btSimple.setNode<2>(1.0);
28  btSimple.setCoefficient<2, 0>(2.0 / 9.0);
29  btSimple.setCoefficient<2, 1>(1.0 / 3.0);
30  btSimple.setCoefficient<2, 2>(4.0 / 9.0);
31 
32  btSimple.setWeight<0>(2.0 / 9.0);
33  btSimple.setWeight<1>(1.0 / 3.0);
34  btSimple.setWeight<2>(4.0 / 9.0);
35  btSimple.setWeight<3>(0.0);
36 
37  btExtended.setNode<0>(1.0 / 2.0);
38  btExtended.setCoefficient<0, 0>(1.0 / 2.0);
39 
40  btExtended.setNode<1>(3.0 / 4.0);
41  btExtended.setCoefficient<1, 0>(0.0);
42  btExtended.setCoefficient<1, 1>(3.0 / 4.0);
43 
44  btExtended.setNode<2>(1.0);
45  btExtended.setCoefficient<2, 0>(2.0 / 9.0);
46  btExtended.setCoefficient<2, 1>(1.0 / 3.0);
47  btExtended.setCoefficient<2, 2>(4.0 / 9.0);
48 
49  btExtended.setWeight<0, true>(2.0 / 9.0);
50  btExtended.setWeight<1, true>(1.0 / 3.0);
51  btExtended.setWeight<2, true>(4.0 / 9.0);
52  btExtended.setWeight<3, true>(0.0);
53 
54  btExtended.setWeight<0, false>(7.0 / 24.0);
55  btExtended.setWeight<1, false>(1.0 / 4.0);
56  btExtended.setWeight<2, false>(1.0 / 3.0);
57  btExtended.setWeight<3, false>(1.0 / 8.0);
58  }
59 
62  };
63 
65  public:
66  static ls::primitives::ButcherTableau<4, true> &getButcherTableau()
67  {
68  static BogackiShampineImpl *boshImpl = new BogackiShampineImpl();
69 
70  return boshImpl->btExtended;
71  }
72 
73  static ls::primitives::ButcherTableau<4, false> &getButcherTableauSimple()
74  {
75  static BogackiShampineImpl *boshImpl = new BogackiShampineImpl();
76 
77  return boshImpl->btSimple;
78  }
79 
80  private:
81  BogackiShampine() = default;
82 
83  // Delete copy/move so extra instances can't be created/moved.
84  BogackiShampine(const BogackiShampine &) = delete;
85 
86  BogackiShampine &operator=(const BogackiShampine &) = delete;
87 
88  BogackiShampine(BogackiShampine &&) = delete;
89 
90  BogackiShampine &operator=(BogackiShampine &&) = delete;
91  };
92  }
93 
94  template<typename TType, typename TScalarType = double>
96  public:
97  typedef std::function<TType(TScalarType, TType)> TDFunction;
98 
99  static const short int kLowerErrorOrder = 2;
100  static const short int kLigherErrorOrder = 3;
101  static const short int kStages = 4;
102 
112  static void integrateSimple(const TDFunction &f, TScalarType &t, TType &y, TScalarType h, size_t N = 1);
113 
125  static TType integrateEmbedded(const TDFunction &f, TScalarType &t, TType &y, TScalarType h, size_t N = 1);
126 
127  // TODO: Add integrate function with maximum allowable error (adaptive step size).
128  };
129 
130  template<typename TType, typename TScalarType>
131  void BogackiShampine<TType, TScalarType>::integrateSimple(const TDFunction &f, TScalarType &t, TType &y,
132  const TScalarType h,
133  size_t N)
134  {
135  for (int i = 0; i < N; i++) {
136  y = detail::BogackiShampine::getButcherTableauSimple().template execute(f, y, t, h);
137  t += h;
138  }
139  }
140 
141  template<typename TType, typename TScalarType>
142  TType BogackiShampine<TType, TScalarType>::integrateEmbedded(const TDFunction &f, TScalarType &t, TType &y,
143  const TScalarType h, size_t N)
144  {
145  std::pair<TType, TType> ye;
146  for (int i = 0; i < N; i++) {
147  ye = detail::BogackiShampine::getButcherTableau().template execute<TType, 0, true>(f, y, t, h);
148  y = ye.first;
149  t += h;
150  }
151 
152  return ye.second;
153  }
154  }
155 }
156 
157 #endif //LODESTAR_BOGACKISHAMPINE_HPP
ls::primitives::detail::BogackiShampine
Definition: BogackiShampine.hpp:64
ls::primitives::BogackiShampine::integrateEmbedded
static TType integrateEmbedded(const TDFunction &f, TScalarType &t, TType &y, TScalarType h, size_t N=1)
Integrate using the Bogacki-Shampine method (ode23) with truncation error output.
Definition: BogackiShampine.hpp:142
ls::primitives::ButcherTableau< 4, false >
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::primitives::detail::BogackiShampineImpl
Definition: BogackiShampine.hpp:14
ls::primitives::BogackiShampine::integrateSimple
static void integrateSimple(const TDFunction &f, TScalarType &t, TType &y, TScalarType h, size_t N=1)
Simple integration using the third-order scheme in the Bogacki-Shampine method.
Definition: BogackiShampine.hpp:131
ls::primitives::BogackiShampine
Definition: BogackiShampine.hpp:95