Controlpp
Loading...
Searching...
No Matches
DiscreteStateSpace.hpp
Go to the documentation of this file.
1#pragma once
2
5
6namespace controlpp
7{
40 template<class ValueType, int internal_states, int inputs, int outputs>
42 public:
43 using value_type = ValueType;
44
46
51
52 constexpr static int number_of_states = internal_states;
53 constexpr static int number_of_inputs = inputs;
54 constexpr static int number_of_outputs = outputs;
55
56 private:
57 state_space_type _state_space;
58
59 public:
60 DiscreteStateSpace() = default;
63
65 const Eigen::Matrix<ValueType, internal_states, internal_states>& A,
66 const Eigen::Matrix<ValueType, internal_states, inputs>& B,
67 const Eigen::Matrix<ValueType, outputs, internal_states>& C,
68 const Eigen::Matrix<ValueType, outputs, inputs>& D)
69 : _state_space(A, B, C, D){}
70
73
74 const state_space_type& state_space() const {return this->_state_space;}
75 state_space_type& state_space() {return this->_state_space;}
76
81 std::tuple<Eigen::Vector<ValueType, internal_states>, Eigen::Vector<ValueType, outputs>> eval(const Eigen::Vector<ValueType, internal_states>& x, const Eigen::Vector<ValueType, inputs>& u) const {
82 return this->_state_space.eval(x, u);
83 }
84
89 template<std::convertible_to<ValueType> U>
90 requires(inputs == 1 && outputs != 1)
91 std::tuple<Eigen::Vector<U, internal_states>, Eigen::Vector<U, outputs>> eval(const Eigen::Vector<U, internal_states>& x, const U& u_scalar) const {
92 return this->_state_space.eval(x, static_cast<ValueType>(u_scalar));
93 }
94
99 template<std::convertible_to<ValueType> U>
100 requires(inputs == 1 && outputs == 1)
101 std::tuple<Eigen::Vector<U, internal_states>, U> eval(const Eigen::Vector<U, internal_states>& x, const U& u_scalar) const {
102 return this->_state_space.eval(x, static_cast<ValueType>(u_scalar));
103 }
104
105
106 A_matrix_type& A() {return this->_state_space.A();}
107 B_matrix_type& B() {return this->_state_space.B();}
108 C_matrix_type& C() {return this->_state_space.C();}
109 D_matrix_type& D() {return this->_state_space.D();}
110
111 const A_matrix_type& A() const {return this->_state_space.A();}
112 const B_matrix_type& B() const {return this->_state_space.B();}
113 const C_matrix_type& C() const {return this->_state_space.C();}
114 const D_matrix_type& D() const {return this->_state_space.D();}
115
116 friend std::ostream& operator<<(std::ostream& stream, const DiscreteStateSpace& dss){
117 stream << dss.state_space();
118 return stream;
119 }
120 };
121
125 template<class T, int NumOrder, int DenOrder>
126 requires(NumOrder <= DenOrder)
128 static constexpr int number_of_states = DenOrder;
130 const T a_0 = rp.den(0);
131 const T b_0 = rp.num(0);
132
133 // normalise
134 const Polynom<T, DenOrder> a = -(rp.den() / a_0);
135 const Polynom<T, NumOrder> b = rp.num() / a_0;
136
137 // write A matrix
138 if constexpr (number_of_states > 0){
139 const auto I = Eigen::Matrix<T, number_of_states-1, number_of_states-1>::Identity();
140 result.A().setOnes();
141 result.A().template block<number_of_states-1, number_of_states-1>(1, 0) = I;
142 result.A().col(number_of_states-1).tail(number_of_states-1).setZero();
143 result.A().row(0) = a.vector().tail(a.vector().size()-1);
144 }
145
146 // write B matrix
147 if constexpr (number_of_states > 0){
148 result.B()(0, 0) = T(1);
149 result.B().col(0).tail(number_of_states-1).setZero();
150 }
151
152 // write C matrix
153 if constexpr (number_of_states > 0){
154 Eigen::Vector<double, DenOrder> aa = a.vector().tail(DenOrder) * b_0;
155 Eigen::Vector<double, DenOrder> bb = Eigen::Vector<double, DenOrder>::Zero();
156 bb.head(NumOrder) = b.vector().tail(b.size()-1);
157 result.C().row(0) = bb + aa;
158 }
159
160 // write D matrix
161 result.D()(0, 0) = b_0;
162 return result;
163 }
164
168 template<class ValueType, int NumOrder, int DenOrder>
172
176 template<class ValueType, int NumOrder, int DenOrder>
180
186 // redo:
187 //template<class T, int states>
188 //DiscreteTransferFunction<T, states+1, states+1> to_transfer_function(const DiscreteStateSpace<T, states, 1, 1>& dss){
189 // return DiscreteTransferFunction<T, states+1, states+1>(to_transfer_function(dss.state_space()));
190 //}
191
192} // namespace control
Matrix (A, B, C, D) representation of a linear time invariant system.
Definition DiscreteStateSpace.hpp:41
DiscreteStateSpace(const Eigen::Matrix< ValueType, internal_states, internal_states > &A, const Eigen::Matrix< ValueType, internal_states, inputs > &B, const Eigen::Matrix< ValueType, outputs, internal_states > &C, const Eigen::Matrix< ValueType, outputs, inputs > &D)
Definition DiscreteStateSpace.hpp:64
C_matrix_type & C()
Definition DiscreteStateSpace.hpp:108
typename state_space_type::D_matrix_type D_matrix_type
Definition DiscreteStateSpace.hpp:50
D_matrix_type & D()
Definition DiscreteStateSpace.hpp:109
typename state_space_type::A_matrix_type A_matrix_type
Definition DiscreteStateSpace.hpp:47
const D_matrix_type & D() const
Definition DiscreteStateSpace.hpp:114
DiscreteStateSpace & operator=(const DiscreteStateSpace &)=default
DiscreteStateSpace(const DiscreteStateSpace &)=default
state_space_type & state_space()
Definition DiscreteStateSpace.hpp:75
typename state_space_type::B_matrix_type B_matrix_type
Definition DiscreteStateSpace.hpp:48
static constexpr int number_of_states
Definition DiscreteStateSpace.hpp:52
const C_matrix_type & C() const
Definition DiscreteStateSpace.hpp:113
std::tuple< Eigen::Vector< ValueType, internal_states >, Eigen::Vector< ValueType, outputs > > eval(const Eigen::Vector< ValueType, internal_states > &x, const Eigen::Vector< ValueType, inputs > &u) const
calculates the next states and calculates the output from the previous states and new inputs
Definition DiscreteStateSpace.hpp:81
std::tuple< Eigen::Vector< U, internal_states >, U > eval(const Eigen::Vector< U, internal_states > &x, const U &u_scalar) const
calculates the next states and calculates the output from the previous states and new inputs
Definition DiscreteStateSpace.hpp:101
static constexpr int number_of_outputs
Definition DiscreteStateSpace.hpp:54
ValueType value_type
Definition DiscreteStateSpace.hpp:43
DiscreteStateSpace(const state_space_type &state_space)
Definition DiscreteStateSpace.hpp:71
const state_space_type & state_space() const
Definition DiscreteStateSpace.hpp:74
std::tuple< Eigen::Vector< U, internal_states >, Eigen::Vector< U, outputs > > eval(const Eigen::Vector< U, internal_states > &x, const U &u_scalar) const
calculates the next states and calculates the output from the previous states and new inputs
Definition DiscreteStateSpace.hpp:91
static constexpr int number_of_inputs
Definition DiscreteStateSpace.hpp:53
const B_matrix_type & B() const
Definition DiscreteStateSpace.hpp:112
B_matrix_type & B()
Definition DiscreteStateSpace.hpp:107
A_matrix_type & A()
Definition DiscreteStateSpace.hpp:106
const A_matrix_type & A() const
Definition DiscreteStateSpace.hpp:111
friend std::ostream & operator<<(std::ostream &stream, const DiscreteStateSpace &dss)
Definition DiscreteStateSpace.hpp:116
typename state_space_type::C_matrix_type C_matrix_type
Definition DiscreteStateSpace.hpp:49
Continuous transfer functions in the s lapace plain.
Definition DiscreteTransferFunction.hpp:23
constexpr transfer_function_type & transfer_function()
Definition DiscreteTransferFunction.hpp:108
Describes a mathematical polynomial.
Definition Polynom.hpp:39
size_t size() const
returns the size of the polynomial
Definition Polynom.hpp:207
vector_type & vector()
Returns the underlying vector that holds the values.
Definition Polynom.hpp:198
Eigen::Matrix< ValueType, NStates, NInputs > B_matrix_type
Definition StateSpace.hpp:36
const A_matrix_type & A() const
Definition StateSpace.hpp:121
Eigen::Matrix< ValueType, NOutputs, NStates > C_matrix_type
Definition StateSpace.hpp:37
const B_matrix_type & B() const
Definition StateSpace.hpp:122
std::tuple< Eigen::Vector< T, NStates >, Eigen::Vector< T, NOutputs > > eval(const Eigen::Vector< T, NStates > &x, const Eigen::Vector< T, NInputs > &u) const
calculates the new system states and outupts
Definition StateSpace.hpp:76
const D_matrix_type & D() const
Definition StateSpace.hpp:124
Eigen::Matrix< ValueType, NOutputs, NInputs > D_matrix_type
Definition StateSpace.hpp:38
const C_matrix_type & C() const
Definition StateSpace.hpp:123
Eigen::Matrix< ValueType, NStates, NStates > A_matrix_type
Definition StateSpace.hpp:35
Definition TransferFunction.hpp:11
constexpr Polynom< T, DenOrder > & den()
returns a reference to the denominator
Definition TransferFunction.hpp:83
constexpr Polynom< T, NumOrder > & num()
returns a reference to the numerator
Definition TransferFunction.hpp:57
The main namespace for the Control++ library.
Definition Bode.cpp:3
DiscreteStateSpace< T, DenOrder, 1, 1 > to_discrete_state_space(const TransferFunction< T, NumOrder, DenOrder > &rp)
constructs a discrete state space function from a rational polynom
Definition DiscreteStateSpace.hpp:127
ContinuousStateSpace< T, DenOrder, 1, 1 > to_state_space(const ContinuousTransferFunction< T, NumOrder, DenOrder > &ctf)
constructs a continuous state space function from a continuous transfer function
Definition ContinuousStateSpace.hpp:91