Controlpp
Loading...
Searching...
No Matches
ContinuousTransferFunction.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "Polynom.hpp"
5
11namespace controlpp
12{
13
27 template<class T, int NumOrder, int DenOrder>
29 public:
30 using value_type = T;
36
37 private:
39 public:
40
44
47
50
51 explicit ContinuousTransferFunction(const Eigen::Vector<T, NumOrder+1>& num, const Eigen::Vector<T, DenOrder+1>& den)
52 : tf_(num, den){}
53
54 explicit ContinuousTransferFunction(const T(&num)[NumOrder+1], const T(&den)[DenOrder+1])
55 : tf_(num, den){}
56
57 num_type& num() {return this->tf_.num();}
58 const num_type& num() const {return this->tf_.num();}
59
60 T& num(size_t i) {return this->tf_.num(i);}
61 const T& num(size_t i) const {return this->tf_.num(i);}
62
63 den_type& den() {return this->tf_.den();}
64 const den_type& den() const {return this->tf_.den();}
65
66 T& den(size_t i) {return this->tf_.den(i);}
67 const T& den(size_t i) const {return this->tf_.den(i);}
68
70 const transfer_function_type& transfer_function() const {return this->tf_;}
71
77 T eval(const T& x) const {
78 return this->tf_.eval(x);
79 }
80
86 template<int M>
87 Eigen::Vector<T, M> eval(const Eigen::Vector<T, M>& x_vec) const {
88 return this->tf_.eval(x_vec);
89 }
90
96 std::complex<T> eval(const std::complex<T>& x) const {
97 return this->tf_.eval(x);
98 }
99
105 template<int M>
106 Eigen::Vector<std::complex<T>, M> eval(const Eigen::Vector<std::complex<T>, M>& x_vec) const {
107 return this->tf_.eval(x_vec);
108 }
109
118 std::complex<T> eval_frequency(const T& frequency) const {
119 return this->tf_.eval_frequency(frequency);
120 }
121
122 std::complex<T> eval_frequency_Hz(const T& frequency) const {
123 return this->tf_.eval_frequency_Hz(frequency);
124 }
125
131 template<int M>
132 Eigen::Vector<std::complex<T>, M> eval_frequencies(const Eigen::Vector<T, M>& frequencies) const {
133 return this->tf_.eval_frequencies(frequencies);
134 }
135
141 template<int M>
142 Eigen::Vector<std::complex<T>, M> eval_frequencies_hz(const Eigen::Vector<T, M>& frequencies) const {
143 return this->tf_.eval_frequencies_hz(frequencies);
144 }
145
146 friend std::ostream& operator<<(std::ostream& stream, const ContinuousTransferFunction& ctf){
147 ctf.transfer_function().print(stream, "s");
148 return stream;
149 }
150 };
151
152 // operator +
153 // -----------
154
155 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
159
160 template<class Tpoly, class Tscalar, int NumOrder, int DenOrder>
163 }
164
165 template<class Tpoly, class Tscalar, int NumOrder, int DenOrder>
168 }
169
170 // operator -
171 // -----------
172
173 template<class T, int NumOrder, int DenOrder>
177
178 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
182
183 template<class T, class Tscalar, int NumOrder, int DenOrder>
186 }
187
188 template<class T, class Tscalar, int NumOrder, int DenOrder>
191 }
192
193 // operator *
194 // -----------
195
196 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
200
201 template<class T, class Tscalar, int NumOrder, int DenOrder>
204 }
205
206 template<class T, class Tscalar, int NumOrder, int DenOrder>
209 }
210
211 // operator /
212 // -----------
213
214 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
218
219 template<class T, class Tscalar, int NumOrder, int DenOrder>
222 }
223
224 template<class T, class Tscalar, int NumOrder, int DenOrder>
227 return result;
228 }
229
230 namespace tf{
231 template<class T=double>
232 static inline const ContinuousTransferFunction<T, 1, 0> s({T(0), T(1)}, {T(1)});
233 }
234
235// analysis
236
237 template<class T, int NumOrder, int DenOrder>
238 Eigen::Vector<std::complex<T>, NumOrder> zeros(const ContinuousTransferFunction<T, NumOrder, DenOrder>& tf){
239 const Eigen::Vector<std::complex<T>, NumOrder> result = zeros(tf.num());
240 return result;
241 }
242
243 template<class T, int NumOrder, int DenOrder>
244 Eigen::Vector<std::complex<T>, DenOrder> poles(const ContinuousTransferFunction<T, NumOrder, DenOrder>& tf){
245 const Eigen::Vector<std::complex<T>, DenOrder> result = zeros(tf.den());
246 return result;
247 }
248
249} // namespace controlpp
Continuous transfer functions in the s lapace plain.
Definition ContinuousTransferFunction.hpp:28
ContinuousTransferFunction(const Eigen::Vector< T, NumOrder+1 > &num, const Eigen::Vector< T, DenOrder+1 > &den)
Definition ContinuousTransferFunction.hpp:51
num_type & num()
Definition ContinuousTransferFunction.hpp:57
ContinuousTransferFunction(const TransferFunction< T, NumOrder, DenOrder > &transfer_function)
Definition ContinuousTransferFunction.hpp:48
T value_type
Definition ContinuousTransferFunction.hpp:30
const num_type & num() const
Definition ContinuousTransferFunction.hpp:58
std::complex< T > eval_frequency_Hz(const T &frequency) const
Definition ContinuousTransferFunction.hpp:122
T & num(size_t i)
Definition ContinuousTransferFunction.hpp:60
Eigen::Vector< std::complex< T >, M > eval(const Eigen::Vector< std::complex< T >, M > &x_vec) const
Evaluates the rational polynomial elementwise at every complex element of the input vector.
Definition ContinuousTransferFunction.hpp:106
typename transfer_function_type::den_vector_type den_vector_type
Definition ContinuousTransferFunction.hpp:35
std::complex< T > eval(const std::complex< T > &x) const
Evaluates the rational polynomial at a complex x
Definition ContinuousTransferFunction.hpp:96
ContinuousTransferFunction & operator=(const ContinuousTransferFunction &)=default
std::complex< T > eval_frequency(const T &frequency) const
Evaluates the transfer function at the given frequency.
Definition ContinuousTransferFunction.hpp:118
transfer_function_type & transfer_function()
Definition ContinuousTransferFunction.hpp:69
Eigen::Vector< std::complex< T >, M > eval_frequencies_hz(const Eigen::Vector< T, M > &frequencies) const
Evaluates the transfer function (Hz) at the given frequencies.
Definition ContinuousTransferFunction.hpp:142
Eigen::Vector< std::complex< T >, M > eval_frequencies(const Eigen::Vector< T, M > &frequencies) const
Evaluates the transfer function (rad/s) at the given frequencies.
Definition ContinuousTransferFunction.hpp:132
Eigen::Vector< T, M > eval(const Eigen::Vector< T, M > &x_vec) const
Evaluates the rational polynomial elementwise at every element of the input vector.
Definition ContinuousTransferFunction.hpp:87
const T & num(size_t i) const
Definition ContinuousTransferFunction.hpp:61
const den_type & den() const
Definition ContinuousTransferFunction.hpp:64
typename transfer_function_type::num_vector_type num_vector_type
Definition ContinuousTransferFunction.hpp:34
ContinuousTransferFunction(const ContinuousTransferFunction &)=default
const transfer_function_type & transfer_function() const
Definition ContinuousTransferFunction.hpp:70
typename transfer_function_type::den_type den_type
Definition ContinuousTransferFunction.hpp:33
const T & den(size_t i) const
Definition ContinuousTransferFunction.hpp:67
ContinuousTransferFunction(const Polynom< T, NumOrder > &num, const Polynom< T, DenOrder > &den)
Definition ContinuousTransferFunction.hpp:45
typename transfer_function_type::num_type num_type
Definition ContinuousTransferFunction.hpp:32
ContinuousTransferFunction(const T(&num)[NumOrder+1], const T(&den)[DenOrder+1])
Definition ContinuousTransferFunction.hpp:54
den_type & den()
Definition ContinuousTransferFunction.hpp:63
T eval(const T &x) const
Evaluates the rational polynomial at x
Definition ContinuousTransferFunction.hpp:77
friend std::ostream & operator<<(std::ostream &stream, const ContinuousTransferFunction &ctf)
Definition ContinuousTransferFunction.hpp:146
T & den(size_t i)
Definition ContinuousTransferFunction.hpp:66
Describes a mathematical polynomial.
Definition Polynom.hpp:39
Definition TransferFunction.hpp:11
Polynom< T, NumOrder > num_type
Definition TransferFunction.hpp:14
constexpr T eval(const T &x) const
Evaluates the rational polynomial at x
Definition TransferFunction.hpp:110
typename num_type::vector_type num_vector_type
Definition TransferFunction.hpp:16
typename den_type::vector_type den_vector_type
Definition TransferFunction.hpp:17
constexpr Eigen::Vector< std::complex< T >, M > eval_frequencies(const Eigen::Vector< T, M > &frequencies) const
Evaluates the transfer function at the given frequencies (rad/s)
Definition TransferFunction.hpp:184
constexpr Eigen::Vector< std::complex< T >, M > eval_frequencies_hz(const Eigen::Vector< T, M > &frequencies) const
Evaluates the transfer function at the given frequencies (Hz)
Definition TransferFunction.hpp:197
constexpr Polynom< T, DenOrder > & den()
returns a reference to the denominator
Definition TransferFunction.hpp:83
constexpr std::complex< T > eval_frequency(const T &frequency) const
Evaluates the transfer function at the given frequency (rad/s)
Definition TransferFunction.hpp:163
void print(std::ostream &stream, std::string_view var="x") const
Definition TransferFunction.hpp:204
Polynom< T, DenOrder > den_type
Definition TransferFunction.hpp:15
constexpr Polynom< T, NumOrder > & num()
returns a reference to the numerator
Definition TransferFunction.hpp:57
constexpr std::complex< T > eval_frequency_Hz(const T &frequency) const
Evaluates the transfer function at the given frequency (Hz)
Definition TransferFunction.hpp:174
const Eigen::Vector< T, Eigen::Dynamic > & frequencies(const Bode< T > &bode)
Converts and returns the frequency vector in rad.
Definition Bode.hpp:461
Bode< T > operator+(const Bode< T > &l, const Bode< T > &r)
Adds two bode plots together.
Definition Bode.hpp:846
The main namespace for the Control++ library.
Definition Bode.cpp:3
Eigen::Vector< std::complex< T >, DenOrder > poles(const ContinuousTransferFunction< T, NumOrder, DenOrder > &tf)
Definition ContinuousTransferFunction.hpp:244
Bode< T > operator-(const Bode< T > &l, const Bode< T > &r)
Definition Bode.hpp:936
Bode< T > operator*(const Bode< T > &l, const Bode< T > &r)
Definition Bode.hpp:979
Eigen::Vector< std::complex< T >, NumOrder > zeros(const ContinuousTransferFunction< T, NumOrder, DenOrder > &tf)
Definition ContinuousTransferFunction.hpp:238
Bode< T > operator/(const Bode< T > &l, const Bode< T > &r)
TODO: make it also work for bode that have different frequency vectors.
Definition Bode.hpp:1026