Lodestar
An integrated real-time control package in C++
DiscreteStateSpace.hpp
1 //
2 // Created by Hamza El-Kebir on 4/21/21.
3 //
4 
5 #ifndef LODESTAR_DISCRETESTATESPACE_HPP
6 #define LODESTAR_DISCRETESTATESPACE_HPP
7 
8 #include "StateSpace.hpp"
9 #include "Lodestar/analysis/ZeroOrderHold.hpp"
10 #include "Lodestar/analysis/BilinearTransformation.hpp"
11 
12 namespace ls {
13  namespace systems {
14  template<typename TScalar = double, int TStateDim = Eigen::Dynamic, int TInputDim = Eigen::Dynamic, int TOutputDim = Eigen::Dynamic>
15  class DiscreteStateSpace : public StateSpace<TScalar, TStateDim, TInputDim, TOutputDim> {
16  public:
18 
24  DiscreteStateSpace() : StateSpace<TScalar, TStateDim, TInputDim, TOutputDim>()
25  {
27  }
28 
35  DiscreteStateSpace(double dt) : StateSpace<TScalar, TStateDim, TInputDim, TOutputDim>()
36  {
38  }
39 
51  DiscreteStateSpace(const Eigen::MatrixXd &A,
52  const Eigen::MatrixXd &B,
53  const Eigen::MatrixXd &C,
54  const Eigen::MatrixXd &D)
55  : StateSpace<>(A, B, C, D)
56  {
58  }
59 
70  DiscreteStateSpace(const Eigen::MatrixXd &A,
71  const Eigen::MatrixXd &B,
72  const Eigen::MatrixXd &C,
73  const Eigen::MatrixXd &D,
74  double dt)
75  : StateSpace<>(A, B, C, D)
76  {
78  }
79 
86  StateSpace<TScalar, TStateDim, TInputDim, TOutputDim>(other)
87  {
89  }
90 
98  void resample(double dt);
99 
107  void resampleFast(double dt);
108 
109  bool isStable(double tolerance = 0) const;
110  };
111  }
112 }
113 
114 template<typename TScalar, int TStateDim, int TInputDim, int TOutputDim>
116 {
118  ls::analysis::ZeroOrderHold::d2c(*this, Base::getSamplingPeriod()), dt);
119 
120  copyMatrices(dss);
121 
122  Base::setSamplingPeriod(dt);
123 }
124 
125 template<typename TScalar, int TStateDim, int TInputDim, int TOutputDim>
127 {
129  ls::analysis::BilinearTransformation::d2cBwdDiff(*this, Base::getSamplingPeriod()), dt);
130 
131  copyMatrices(dss);
132 
133  Base::setSamplingPeriod(dt);
134 }
135 
136 template<typename TScalar, int TStateDim, int TInputDim, int TOutputDim>
138 {
139  auto eig = Base::A_->eigenvalues();
140  double tol = (tolerance < 0 ? -tolerance * tolerance : tolerance *
141  tolerance);
142 
143  for (int i = 0; i < eig.size(); i++) {
144  if (eig(i).real() * eig(i).real() + eig(i).imag() * eig(i).imag() > 1 + tol)
145  return false;
146  }
147 
148  return true;
149 }
150 
151 #endif //LODESTAR_DISCRETESTATESPACE_HPP
ls::systems::DiscreteStateSpace
Definition: DiscreteStateSpace.hpp:15
ls::systems::StateSpace::isDiscrete_
bool isDiscrete_
Sampling period.
Definition: StateSpace.hpp:385
ls::systems::DiscreteStateSpace::DiscreteStateSpace
DiscreteStateSpace(double dt)
Constructs empty discrete state space system with given sampling period.
Definition: DiscreteStateSpace.hpp:35
ls::analysis::BilinearTransformation::d2cBwdDiff
static systems::StateSpace d2cBwdDiff(const systems::StateSpace<> &ss, double dt)
Generates backward differencing transform of a discrete-time state space system.
Definition: BilinearTransformation.cpp:121
ls
Main Lodestar code.
Definition: BilinearTransformation.hpp:12
ls::systems::StateSpace::setDiscreteParams
void setDiscreteParams(double dt)
Sets the discrete time system parameters.
Definition: StateSpace.hpp:609
ls::systems::DiscreteStateSpace::DiscreteStateSpace
DiscreteStateSpace(const DiscreteStateSpace &other)
Copy constructor.
Definition: DiscreteStateSpace.hpp:85
ls::systems::StateSpace
Definition: StateSpace.hpp:15
ls::systems::DiscreteStateSpace::resampleFast
void resampleFast(double dt)
Resamples the system.
Definition: DiscreteStateSpace.hpp:126
ls::systems::DiscreteStateSpace::DiscreteStateSpace
DiscreteStateSpace(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D, double dt)
Constructs a discrete state space system with the given matrices.
Definition: DiscreteStateSpace.hpp:70
ls::systems::DiscreteStateSpace::resample
void resample(double dt)
Resamples the system.
Definition: DiscreteStateSpace.hpp:115
ls::analysis::BilinearTransformation::c2dBwdDiff
static systems::StateSpace c2dBwdDiff(const systems::StateSpace<> &ss, double dt)
Generates backward differencing transform of a continuous-time state space system.
Definition: BilinearTransformation.cpp:114
ls::systems::StateSpace::dt_
double dt_
Feedforward matrix.
Definition: StateSpace.hpp:384
ls::systems::DiscreteStateSpace::DiscreteStateSpace
DiscreteStateSpace()
Default constructor.
Definition: DiscreteStateSpace.hpp:24
ls::analysis::ZeroOrderHold::d2c
static systems::StateSpace< double, Eigen::Dynamic, Eigen::Dynamic, Eigen::Dynamic > d2c(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D, double dt)
Reverts a zero-order hold discretization on a discrete-time state space system.
Definition: ZeroOrderHold.cpp:62
ls::systems::DiscreteStateSpace::DiscreteStateSpace
DiscreteStateSpace(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D)
Constructs a discrete state space system with the given matrices.
Definition: DiscreteStateSpace.hpp:51
ls::analysis::ZeroOrderHold::c2d
static systems::StateSpace c2d(const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D, double dt)
Generates zero-order hold discretization from a continuous-time state space system.
Definition: ZeroOrderHold.cpp:8