4#include <initializer_list>
10 template<
class T,
int NumOrder,
int DenOrder>
28 template<
int NumOrder2,
int DenOrder2>
29 requires(((NumOrder2 < NumOrder) || (DenOrder2 < DenOrder)) && (NumOrder2 <= NumOrder) && (DenOrder2 <= DenOrder))
33 template<
int NumOrder2,
int DenOrder2>
34 requires(((NumOrder2 < NumOrder) || (DenOrder2 < DenOrder)) && (NumOrder2 <= NumOrder) && (DenOrder2 <= DenOrder))
36 this->
num() = other.num();
37 this->
den() = other.den();
70 constexpr T&
num(
size_t i) {
return this->_num.
at(i);}
77 constexpr const T&
num(
size_t i)
const {
return this->_num.
at(i);}
96 constexpr T&
den(
size_t i) {
return this->_den.
at(i);}
103 constexpr const T&
den(
size_t i)
const {
return this->_den.
at(i);}
110 constexpr T
eval(
const T& x)
const {
111 const T n = this->
num().
eval(x);
112 const T d = this->
den().
eval(x);
113 const T result = n/d;
123 constexpr Eigen::Vector<T, M>
eval(
const Eigen::Vector<T, M>& x_vec)
const {
124 const Eigen::Vector<T, M> n = this->
num().
eval(x_vec);
125 const Eigen::Vector<T, M> d = this->
den().
eval(x_vec);
126 const T result = n.array()/d.array();
135 constexpr std::complex<T>
eval(
const std::complex<T>& x)
const {
136 const std::complex<T> n = this->
num().
eval(x);
137 const std::complex<T> d = this->
den().
eval(x);
138 const std::complex<T> result = n/d;
148 constexpr Eigen::Vector<std::complex<T>, M>
eval(
const Eigen::Vector<std::complex<T>, M>& x_vec)
const {
149 const Eigen::Vector<std::complex<T>, M> n = this->
num().
eval(x_vec);
150 const Eigen::Vector<std::complex<T>, M> d = this->
den().
eval(x_vec);
151 const Eigen::Vector<std::complex<T>, M> result = n.array()/d.array();
164 const std::complex<T> jw(0, frequency);
165 const std::complex<T> result = this->
eval(jw);
175 return this->
eval_frequency(frequency *
static_cast<T
>(2) * std::numbers::pi_v<T>);
185 const std::complex<T> j(0, 1);
186 const Eigen::Vector<std::complex<T>, M> complex_frequencies =
frequencies * j;
187 const Eigen::Vector<std::complex<T>, M> result = this->
eval(complex_frequencies);
198 const std::complex<T> j(0, 1);
199 const Eigen::Vector<std::complex<T>, M> complex_frequencies =
frequencies * j *
static_cast<T
>(2) * std::numbers::pi_v<T>;
200 const Eigen::Vector<std::complex<T>, M> result = this->
eval(complex_frequencies);
204 void print(std::ostream& stream, std::string_view var=
"x")
const {
205 stream <<
"num: "; this->
num().
print(stream, var);
206 stream <<
"\nden: "; this->
den().
print(stream, var);
209 void print(std::ostream& stream, std::function<std::string(
int i)> var)
const {
210 stream <<
"num: "; this->
num().
print(stream, var);
211 stream <<
"\nden: "; this->
den().
print(stream, var);
224 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
226 return ((lhs.
num() == rhs.
num()) && (lhs.
den() == rhs.
den()));
229 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
231 return ((lhs.
num() != rhs.
num()) || (lhs.
den() != rhs.
den()));
258 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
263 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
268 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
276 template<
class T,
int NumOrder1,
int DenOrder1>
281 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
287 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
292 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
300 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
306 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
311 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
319 template<
class T,
int NumOrder1,
int DenOrder1,
int NumOrder2,
int DenOrder2>
324 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
329 template<
class T, std::convertible_to<T> Tscalar,
int NumOrder,
int DenOrder>
339 template<
class T,
int NumOrder,
int DenOrder>
344 template<
class T,
int NumOrder,
int DenOrder>
360 template<
class T,
int N>
378 template<std::convertible_to<T> U>
381 this->_num.
at(0) =
static_cast<T
>(scalar);
383 this->_den.
at(0) =
static_cast<T
>(0);
416 void print(std::ostream& stream, std::string_view var=
"x")
const {
417 stream <<
"num: "; this->
num().
print(stream, var);
418 stream <<
"\nden: "; this->
den().
print(stream, var); stream <<
'\n';
430 template<
class T,
int N>
432 return ((lhs.
num() == rhs.
num()) && (lhs.
den() == rhs.
den()));
435 template<
class T,
int N>
437 return ((lhs.
num() != rhs.
num()) || (lhs.
den() != rhs.
den()));
464 template<
class T,
int N>
469 template<
class T, std::convertible_to<T> Tscalar,
int N>
474 template<
class T, std::convertible_to<T> Tscalar,
int N>
482 template<
class T,
int N>
487 template<
class T,
int N>
493 template<
class T, std::convertible_to<T> Tscalar,
int N>
498 template<
class T, std::convertible_to<T> Tscalar,
int N>
506 template<
class T,
int N>
512 template<
class T, std::convertible_to<T> Tscalar,
int N>
517 template<
class T, std::convertible_to<T> Tscalar,
int N>
525 template<
class T,
int N>
530 template<
class T, std::convertible_to<T> Tscalar,
int N>
535 template<
class T, std::convertible_to<T> Tscalar,
int N>
544 template<
typename T,
int N>
545 struct NumTraits<
controlpp::FixedRationalPolynom<T, N>> {
556 RequireInitialization = 1,
571 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
572 struct ScalarBinaryOpTraits<
574 controlpp::FixedRationalPolynom<Tpoly, N>,
575 internal::scalar_sum_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
577 using ReturnType =
decltype(std::declval<Tscalar>() + std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
580 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
581 struct ScalarBinaryOpTraits<
582 controlpp::FixedRationalPolynom<Tpoly, N>,
584 internal::scalar_sum_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
586 using ReturnType =
decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() + std::declval<Tscalar>());
589 template <
class Tpoly,
int N>
590 struct ScalarBinaryOpTraits<
591 controlpp::FixedRationalPolynom<Tpoly, N>,
593 internal::scalar_sum_op<controlpp::FixedRationalPolynom<Tpoly, N>, controlpp::FixedRationalPolynom<Tpoly, N>>>
601 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
602 struct ScalarBinaryOpTraits<
604 controlpp::FixedRationalPolynom<Tpoly, N>,
605 internal::scalar_difference_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
607 using ReturnType =
decltype(std::declval<Tscalar>() - std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
610 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
611 struct ScalarBinaryOpTraits<
612 controlpp::FixedRationalPolynom<Tpoly, N>,
614 internal::scalar_difference_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
616 using ReturnType =
decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() - std::declval<Tscalar>());
619 template <
class Tpoly,
int N>
620 struct ScalarBinaryOpTraits<
621 controlpp::FixedRationalPolynom<Tpoly, N>,
623 internal::scalar_difference_op<controlpp::FixedRationalPolynom<Tpoly, N>, controlpp::FixedRationalPolynom<Tpoly, N>>>
631 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
632 struct ScalarBinaryOpTraits<
634 controlpp::FixedRationalPolynom<Tpoly, N>,
635 internal::scalar_product_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
637 using ReturnType =
decltype(std::declval<Tscalar>() * std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
640 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
641 struct ScalarBinaryOpTraits<
642 controlpp::FixedRationalPolynom<Tpoly, N>,
644 internal::scalar_product_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
646 using ReturnType =
decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() * std::declval<Tscalar>());
649 template <
class Tpoly,
int N>
650 struct ScalarBinaryOpTraits<
651 controlpp::FixedRationalPolynom<Tpoly, N>,
653 internal::scalar_product_op<controlpp::FixedRationalPolynom<Tpoly, N>, controlpp::FixedRationalPolynom<Tpoly, N>>>
661 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
662 struct ScalarBinaryOpTraits<
664 controlpp::FixedRationalPolynom<Tpoly, N>,
665 internal::scalar_quotient_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
667 using ReturnType =
decltype(std::declval<Tscalar>() / std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
670 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
671 struct ScalarBinaryOpTraits<
672 controlpp::FixedRationalPolynom<Tpoly, N>,
674 internal::scalar_quotient_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
676 using ReturnType =
decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() / std::declval<Tscalar>());
679 template <
class Tpoly,
int N>
680 struct ScalarBinaryOpTraits<
681 controlpp::FixedRationalPolynom<Tpoly, N>,
683 internal::scalar_quotient_op<controlpp::FixedRationalPolynom<Tpoly, N>, controlpp::FixedRationalPolynom<Tpoly, N>>>
void print(std::ostream &stream, std::string_view var="x") const
prints polynomial to an output character stream with a variale
Definition Polynom.hpp:859
const T & at(size_t i) const
Access elements at the i-th position.
Definition Polynom.hpp:818
void setZero()
sets all entries to zero
Definition Polynom.hpp:854
Eigen::Vector< T, Order+1 > vector_type
Definition Polynom.hpp:668
Fixed sized polynomial.
Definition TransferFunction.hpp:361
constexpr const den_type & den() const
Definition TransferFunction.hpp:414
constexpr FixedRationalPolynom & operator=(const FixedRationalPolynom &)=default
T value_type
Definition TransferFunction.hpp:363
constexpr FixedRationalPolynom()=default
friend std::ostream & operator<<(std::ostream &stream, const FixedRationalPolynom &rpoly)
Definition TransferFunction.hpp:421
constexpr TransferFunction< T, N, N > toRationalPolynom() const
Definition TransferFunction.hpp:406
constexpr FixedRationalPolynom(const Polynom< T, N > &num, const Polynom< T, N > &den)
Definition TransferFunction.hpp:386
constexpr FixedRationalPolynom(const FixedPolynom< T, N > &num, const FixedPolynom< T, N > &den)
Definition TransferFunction.hpp:390
constexpr den_type & den()
Definition TransferFunction.hpp:413
typename den_type::vector_type den_vector_type
Definition TransferFunction.hpp:367
constexpr const num_type & num() const
Definition TransferFunction.hpp:411
typename num_type::vector_type num_vector_type
Definition TransferFunction.hpp:366
constexpr FixedRationalPolynom(const T(&num)[N], const T(&den)[N])
Definition TransferFunction.hpp:398
void print(std::ostream &stream, std::string_view var="x") const
Definition TransferFunction.hpp:416
constexpr FixedRationalPolynom(const num_vector_type &num, const den_vector_type &den)
Definition TransferFunction.hpp:394
constexpr FixedRationalPolynom(const FixedRationalPolynom &)=default
constexpr num_type & num()
Definition TransferFunction.hpp:410
constexpr FixedRationalPolynom(const U &scalar)
Definition TransferFunction.hpp:379
Eigen::Vector< T, eigen_vector_size > vector_type
Definition Polynom.hpp:43
const T & at(size_t i) const
Access elements at the i-th position.
Definition Polynom.hpp:179
void print(std::ostream &stream, std::string_view var="x") const
prints polynomial to an output character stream with a variale
Definition Polynom.hpp:343
T eval(const T &x) const
Evaluates the polynomial at position x.
Definition Polynom.hpp:232
Definition TransferFunction.hpp:11
constexpr T & num(size_t i)
Returns the parameter of the numerator polynomial at the index/position i.
Definition TransferFunction.hpp:70
friend std::ostream & operator<<(std::ostream &stream, const TransferFunction &rpoly)
Definition TransferFunction.hpp:214
constexpr std::complex< T > eval(const std::complex< T > &x) const
Evaluates the rational polynomial at a complex x
Definition TransferFunction.hpp:135
constexpr const T & num(size_t i) const
Returns the parameter of the numerator polynomial at the index/position i.
Definition TransferFunction.hpp:77
constexpr TransferFunction & operator=(const TransferFunction &)=default
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
constexpr 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 TransferFunction.hpp:123
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 TransferFunction(const TransferFunction &)=default
constexpr TransferFunction(const T(&num)[NumOrder+1], const T(&den)[DenOrder+1])
Definition TransferFunction.hpp:49
constexpr const T & den(size_t i) const
Returns the parameter of the denominator polynomial at the index/position i.
Definition TransferFunction.hpp:103
constexpr 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 TransferFunction.hpp:148
constexpr TransferFunction(const Polynom< T, NumOrder > &num, const Polynom< T, DenOrder > &den)
Definition TransferFunction.hpp:41
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 TransferFunction()=default
T value_type
Definition TransferFunction.hpp:13
void print(std::ostream &stream, std::function< std::string(int i)> var) const
Definition TransferFunction.hpp:209
constexpr Polynom< T, DenOrder > & den()
returns a reference to the denominator
Definition TransferFunction.hpp:83
constexpr const Polynom< T, NumOrder > & num() const
returns a reference to the numerator
Definition TransferFunction.hpp:63
constexpr std::complex< T > eval_frequency(const T &frequency) const
Evaluates the transfer function at the given frequency (rad/s)
Definition TransferFunction.hpp:163
constexpr TransferFunction(const num_vector_type &num, const den_vector_type &den)
Definition TransferFunction.hpp:45
void print(std::ostream &stream, std::string_view var="x") const
Definition TransferFunction.hpp:204
constexpr T & den(size_t i)
Returns the parameter of the denominator polynomial at the index/position i.
Definition TransferFunction.hpp:96
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
constexpr const Polynom< T, DenOrder > & den() const
returns a reference to the denominator
Definition TransferFunction.hpp:89
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
Definition Polynom.hpp:1012
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
bool operator==(const Polynom< T, N > &lhs, const Polynom< T, N > &rhs)
Compares two polynomials for equality.
Definition Polynom.hpp:518
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
bool operator!=(const Polynom< T, N > &lhs, const Polynom< T, N > &rhs)
Definition Polynom.hpp:523
static Self lowest()
Definition TransferFunction.hpp:565
static Self epsilon()
Definition TransferFunction.hpp:562
static Self dummy_precision()
Definition TransferFunction.hpp:563
static Self highest()
Definition TransferFunction.hpp:564
decltype(std::declval< Tscalar >() *std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:637
decltype(std::declval< Tscalar >() - std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:607
decltype(std::declval< Tscalar >()/std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:667
decltype(std::declval< Tscalar >()+std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:577
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()/std::declval< Tscalar >()) ReturnType
Definition TransferFunction.hpp:676
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >() *std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:655
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >() - std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:625
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >() - std::declval< Tscalar >()) ReturnType
Definition TransferFunction.hpp:616
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >() *std::declval< Tscalar >()) ReturnType
Definition TransferFunction.hpp:646
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()+std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:595
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()/std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()) ReturnType
Definition TransferFunction.hpp:685
decltype(std::declval< controlpp::FixedRationalPolynom< Tpoly, N > >()+std::declval< Tscalar >()) ReturnType
Definition TransferFunction.hpp:586