Controlpp
Loading...
Searching...
No Matches
transformations.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4#include <Eigen/Dense>
5#include <Eigen/LU>
6
7
8// controlpp
9#include <controlpp/math.hpp>
10#include <controlpp/expm.hpp>
11
14
17
18
19namespace controlpp
20{
21
22 enum class EDiscretisation{
24 tustin
25 };
26
64 template<class ValueType, int states>
67 ValueType sample_time
68 ){
69 // allocation
71 Eigen::Matrix<ValueType, states+1, states+1> M;
72
73 // scale the energy of the states
74
75 // preparation
76 M.template block<states, states>(0, 0) = sys.A();
77 M.col(states).head(states) = sys.B().col(0);
78 M.row(states).setZero();
79 M *= sample_time;
80
81 // calculation
82 Eigen::Matrix<ValueType, states+1, states+1> Md = controlpp::expm(M);
83
84 // re-assignment
85 result.A() = Md.template block<states, states>(0, 0);
86 result.B().col(0) = Md.col(states).head(states);
87 result.C() = sys.C();
88 result.D() = sys.D();
89
90 return result;
91 }
92
120 template<class T, int NStates, int NInputs, int NOutputs>
123 const T& sample_time
124 ){
125 const Eigen::Matrix<T, NStates, NStates> I = Eigen::Matrix<T, NStates, NStates>::Identity();
126 const Eigen::Matrix<T, NStates, NStates> M = (I - (sample_time / static_cast<T>(2)) * sys.A()).eval();
127 const Eigen::Matrix<T, NStates, NStates> P = (I + (sample_time / static_cast<T>(2)) * sys.A()).eval();
128
129 Eigen::PartialPivLU<Eigen::Matrix<T, NStates, NStates>> Mfactor(M);
130
131 const Eigen::Matrix<T, NStates, NStates> A_d = Mfactor.solve(P);
132 const Eigen::Matrix<T, NStates, NInputs> B_d = Mfactor.solve(sample_time * sys.B());
133 const Eigen::Matrix<T, NOutputs, NStates> C_d = M.transpose().partialPivLu().solve(sys.C().transpose()).transpose();
134 const Eigen::Matrix<T, NOutputs, NInputs> X = (sys.C() * Mfactor.solve(sys.B() * (sample_time / static_cast<T>(2))));
135 const Eigen::Matrix<T, NOutputs, NInputs> D_d = (sys.D() + X);
136
137 const DiscreteStateSpace<T, NStates, NInputs, NOutputs> result(A_d, B_d, C_d, D_d);
138 return result;
139 }
140
141
142 template<class T, int NStates>
145 const T& sample_time,
146 EDiscretisation method
147 ){
149 return discretise_zoh(sys, sample_time);
150 }else{
151 return discretise_tustin(sys, sample_time);
152 }
153 }
154
155
156
157} // namespace controlpp
158
Definition ContinuousStateSpace.hpp:10
A_matrix_type & A()
Definition ContinuousStateSpace.hpp:55
D_matrix_type & D()
Definition ContinuousStateSpace.hpp:58
B_matrix_type & B()
Definition ContinuousStateSpace.hpp:56
C_matrix_type & C()
Definition ContinuousStateSpace.hpp:57
Matrix (A, B, C, D) representation of a linear time invariant system.
Definition DiscreteStateSpace.hpp:41
C_matrix_type & C()
Definition DiscreteStateSpace.hpp:108
D_matrix_type & D()
Definition DiscreteStateSpace.hpp:109
B_matrix_type & B()
Definition DiscreteStateSpace.hpp:107
A_matrix_type & A()
Definition DiscreteStateSpace.hpp:106
Includes functions for matrix exponentiation.
The main namespace for the Control++ library.
Definition Bode.cpp:3
Eigen::Matrix< T, N, N > expm(const Eigen::Matrix< T, N, N, Options, MaxRows, MaxCols > &M)
Calculates the matrix exponent .
Definition expm.hpp:275
DiscreteStateSpace< T, NStates, 1, 1 > discretise(const ContinuousStateSpace< T, NStates, 1, 1 > &sys, const T &sample_time, EDiscretisation method)
Definition transformations.hpp:143
DiscreteStateSpace< T, NStates, NInputs, NOutputs > discretise_tustin(const ContinuousStateSpace< T, NStates, NInputs, NOutputs > &sys, const T &sample_time)
discretises a continuous state space to a discrete one with the Tustin transformation
Definition transformations.hpp:121
EDiscretisation
Definition transformations.hpp:22
DiscreteStateSpace< ValueType, states, 1, 1 > discretise_zoh(const ContinuousStateSpace< ValueType, states, 1, 1 > &sys, ValueType sample_time)
transform s-domain into z-domain using zero-order-hold
Definition transformations.hpp:65