6#include <initializer_list>
15#include <Eigen/Eigenvalues>
38 template<
class T,
int Order>
42 static constexpr int eigen_vector_size = (Order == Eigen::Dynamic) ? Eigen::Dynamic : Order + 1;
56 template<
int OtherOrder>
57 requires(OtherOrder < Order)
60 for(; i < other.
size(); ++i){
61 this->
at(i) = other.
at(i);
63 for(; i < this->
size(); ++i){
64 this->
at(i) =
static_cast<T
>(0);
68 template<
class... Args>
69 requires(Order != Eigen::Dynamic && (std::convertible_to<Args, T> && ...))
70 explicit Polynom(Args&&... args) : vector_(std::forward<Args>(args)...){}
72 template<
class... Args>
73 requires(Order == Eigen::Dynamic && (std::convertible_to<Args, T> && ...))
74 explicit Polynom(Args&&... args) : vector_(Eigen::Vector<T,
sizeof...(Args)>(std::forward<Args>(args)...)){}
85 for(; i < other.
size(); ++i){
86 this->
at(i) = other.
at(i);
88 for(; i < this->
size(); ++i){
89 this->
at(i) =
static_cast<T
>(0);
97 requires((Order != Eigen::Dynamic) && (M == Order+1))
98 explicit Polynom(
const T (&array)[M]) : vector_(array){}
103 requires((Order != Eigen::Dynamic) && (M < Order+1))
107 this->vector_[i] = array[i];
109 for(; i < this->
size(); ++i){
110 this->vector_[i] =
static_cast<T
>(0);
120 if constexpr (Order == Eigen::Dynamic){
121 this->vector_.resize(length);
124 for(; i < length && i < this->
size(); ++i){
125 this->vector_(i) =
values[i];
127 for(; i < this->
size(); ++i){
128 this->vector_(i) =
static_cast<T
>(0);
138 requires(Order == Eigen::Dynamic)
145 requires((Order != Eigen::Dynamic) && (M != Eigen::Dynamic) && (M == Order+1))
149 requires(std::constructible_from<Eigen::Vector<T, eigen_vector_size>, U>)
150 explicit Polynom(
const U& vector_expression) : vector_(vector_expression){}
153 requires((Order != Eigen::Dynamic) && (M != Eigen::Dynamic) && (M < Order+1))
156 for(; i <
vector.size(); ++i){
157 this->vector_[i] =
vector(i);
159 for(; i < this->
size(); ++i){
160 this->vector_[i] =
static_cast<T
>(0);
164 template<std::same_as<T> U>
165 requires(Order == Eigen::Dynamic)
171 requires(Order == Eigen::Dynamic && M != Eigen::Dynamic)
179 const T&
at(
size_t i)
const {
return this->vector_[i];}
184 T&
at(
size_t i) {
return this->vector_[i];}
207 size_t size()
const {
return this->vector_.size();}
213 size_t result = this->
size()-1;
214 for(
size_t i = 0; i < this->
size(); ++i){
215 const T& elem = this->
at(this->
size() - 1 - i);
233 T sum =
static_cast<T
>(0);
234 for(
int i = this->
size()-1; i >= 0; --i){
235 sum = sum * x + this->
at(i);
246 return this->
eval(x);
255 Eigen::Vector<T, M>
eval(
const Eigen::Vector<T, M>& x_vec)
const {
256 Eigen::Vector<T, M> sum_vec;
257 if constexpr (M == Eigen::Dynamic) sum_vec.resize(x_vec.size());
260 for(
int i = this->
size()-1; i >= 0; --i){
261 sum_vec.array() = sum_vec.array() * x_vec.array() + this->
at(i);
273 Eigen::Vector<T, M>
operator() (
const Eigen::Vector<T, M>& x_vec)
const {
274 return this->
eval(x_vec);
281 std::complex<T>
eval(
const std::complex<T>& x)
const {
282 std::complex<T> sum(
static_cast<T
>(0),
static_cast<T
>(0));
283 for(
int i = this->
size()-1; i >= 0; --i){
284 sum = sum * x + this->
at(i);
294 std::complex<T>
operator() (
const std::complex<T>& x)
const {
295 return this->
eval(x);
304 Eigen::Vector<std::complex<T>, M>
eval(
const Eigen::Vector<std::complex<T>, M>& x_vec)
const {
305 Eigen::Vector<std::complex<T>, M> sum_vec;
306 if constexpr (M == Eigen::Dynamic) sum_vec.resize(x_vec.size());
309 for(
int i = this->
size()-1; i >= 0; --i){
310 sum_vec.array() = sum_vec.array() * x_vec.array() + this->
at(i);
322 Eigen::Vector<std::complex<T>, M>
operator() (
const Eigen::Vector<std::complex<T>, M>& x_vec)
const {
323 return this->
eval(x_vec);
331 bool is_zero(T epsilon = std::numeric_limits<T>::min())
const {
332 for(
size_t i = 0; i < this->
size(); ++i){
333 if((this->
at(i) >= epsilon)){
343 void print (std::ostream& stream, std::string_view var=
"x")
const {
348 for(
size_t i = 0; i < this->
size(); ++i){
349 if(this->
at(i) !=
static_cast<T
>(0)){
350 const auto value = this->
at(i);
352 if(i > 0) stream <<
" + ";
356 if(i == 1) stream <<
' ' << var;
357 else if(i > 1) stream <<
' ' << var <<
'^' << i;
359 if(i == 0) stream <<
"- ";
360 else if(i > 0) stream <<
" - ";
364 if(i == 1) stream <<
' ' << var;
365 else if(i > 1) stream <<
' ' << var <<
'^' << i;
371 void print (std::ostream& stream, std::function<std::string(
int i)> var)
const {
376 for(
size_t i = 0; i < this->
size(); ++i){
377 if(this->
at(i) !=
static_cast<T
>(0)){
378 const auto value = this->
at(i);
380 if(i > 0) stream <<
" + ";
384 if(i == 1) stream <<
' ' << var(i);
385 else if(i > 1) stream <<
' ' << var(i) <<
'^' << i;
387 if(i == 0) stream <<
"- ";
388 else if(i > 0) stream <<
" - ";
392 if(i == 1) stream <<
' ' << var(i);
393 else if(i > 1) stream <<
' ' << var(i) <<
'^' << i;
404 poly.
print(stream,
"x");
411 for(
size_t i = 0; i < other.
size(); ++i){
412 this->
at(i) += other.
at(i);
420 for(
size_t i = 0; i < other.
size(); ++i){
421 this->
at(i) -= other.
at(i);
426 template<std::convertible_to<T> U>
428 this->
vector() *=
static_cast<T
>(num);
432 template<std::convertible_to<T> U>
434 this->
vector() /=
static_cast<T
>(num);
448 return Eigen::Vector<std::complex<T>, 0>();
466 const std::complex x0 = - polynom[0] / polynom[1];
467 Eigen::Vector<std::complex<T>, 1> result(x0);
484 const std::complex c = polynom[0];
485 const std::complex b = polynom[1];
486 const std::complex a = polynom[2];
487 const std::complex x1 = (-b - std::sqrt(b * b -
static_cast<T
>(4) * a * c)) / (
static_cast<T
>(2) * a);
488 const std::complex x2 = (-b + std::sqrt(b * b -
static_cast<T
>(4) * a * c)) / (
static_cast<T
>(2) * a);
489 const Eigen::Vector<std::complex<T>, 2> result(x1, x2);
499 template<
class T,
int N>
503 const Eigen::Vector<std::complex<T>, N> result = C.eigenvalues();
517 template<
class T,
int N>
522 template<
class T,
int N>
534 template<
class T,
int Nl,
int Nr>
536 if constexpr (Nl > Nr){
538 result.
vector().head(rhs.size()) = lhs.vector().head(rhs.size()) + rhs.vector();
539 result.
vector().tail(lhs.size() - rhs.size()) = lhs.vector().tail(lhs.size() - rhs.size());
541 }
else if constexpr (Nl == Nr){
545 result.
vector().head(lhs.size()) = lhs.vector() + rhs.vector().head(lhs.size());
546 result.
vector().tail(rhs.size() - lhs.size()) = rhs.vector().tail(rhs.size() - lhs.size());
551 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
554 result[0] +=
static_cast<Tpoly
>(lhs);
558 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
560 return ((
static_cast<Tpoly
>(rhs) + lhs).eval());
566 template<
class T,
int N>
571 template<
class T,
int Nl,
int Nr>
573 if constexpr (Nl > Nr){
575 result.
vector().head(rhs.size()) = lhs.vector().head(rhs.size()) - rhs.vector();
576 result.
vector().tail(lhs.size() - rhs.size()) = lhs.vector().tail(lhs.size() - rhs.size());
578 }
else if constexpr (Nl == Nr){
582 result.
vector().head(lhs.size()) = lhs.vector() + rhs.vector().head(lhs.size());
583 result.
vector().tail(rhs.size() - lhs.size()) = -rhs.vector().tail(rhs.size() - lhs.size());
588 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
591 result[0] +=
static_cast<Tpoly
>(lhs);
595 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
598 result[0] -=
static_cast<Tpoly
>(rhs);
605 template<
class T,
int lOrder,
int rOrder>
610 for(
size_t i = 0; i < rhs.
size(); ++i){
617 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int Order>
622 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int Order>
630 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int Order>
664 template<
class T,
int Order>
681 template<std::convertible_to<T> U>
683 vector_(0) =
static_cast<T
>(value);
690 for(; i < other.
size(); ++i){
691 this->
at(i) = other.
at(i);
693 for(; i < this->
size(); ++i){
694 this->
at(i) =
static_cast<T
>(0);
705 for(; i < other.
size(); ++i){
706 this->
at(i) = other.
at(i);
708 for(; i < this->
size(); ++i){
709 this->
at(i) =
static_cast<T
>(0);
718 for(
size_t i = 0; i < this->
size(); ++i){
719 this->vector_[i] =
values[i];
724 requires(M < Order+1)
728 this->vector_[i] =
values[i];
730 for(; i < this->
size(); ++i){
731 this->vector_[i] =
static_cast<T
>(0);
740 requires(M < Order+1)
743 for(; i <
vector.size(); ++i){
744 this->vector_[i] =
vector[i];
746 for(; i < this->
size(); ++i){
747 this->vector_[i] =
static_cast<T
>(0);
757 requires(M < Order+1)
761 this->vector_[i] =
values[i];
763 for(; i < this->
size(); ++i){
764 this->vector_[i] =
static_cast<T
>(0);
776 this->vector_[i] = poly[i];
778 for(; i < this->
size(); ++i){
779 this->vector_[i] =
static_cast<T
>(0);
793 requires(M < Order+1)
797 this->vector_[i] =
vector[i];
799 for(; i < this->
size(); ++i){
800 this->vector_[i] =
static_cast<T
>(0);
808 const T&
operator[](
size_t i)
const {
return this->vector_[i];}
818 const T&
at(
size_t i)
const {
return this->vector_[i];}
823 T&
at(
size_t i) {
return this->vector_[i];}
836 size_t size()
const {
return Order+1;}
842 size_t result = Order;
844 for(
size_t i = 0; i < this->
size(); ++i){
845 if(this->
at(this->
size() - i - 1) != zero){
859 void print (std::ostream& stream, std::string_view var=
"x")
const {
860 std::string_view plus =
"";
861 for(
size_t i = 0; i < this->
size(); ++i){
862 if(this->
at(i) !=
static_cast<T
>(0)){
863 stream << plus << this->
at(i) <<
' ' << var <<
'^' << i;
874 poly.
print(stream,
"x");
881 for(
size_t i = 0; i < other->
size(); ++i){
882 this->
at(i) += other.
at(i);
890 for(
size_t i = 0; i < other->
size(); ++i){
891 this->
at(i) -= other.
at(i);
907 template<
class T,
int N>
912 template<
class T,
int N>
924 template<
class T,
int N>
929 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
933 result[0] +=
static_cast<Tpoly
>(lhs);
937 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
940 return (
static_cast<Tpoly
>(rhs) + lhs);
946 template<
class T,
int N>
951 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
955 result[0] +=
static_cast<Tpoly
>(lhs);
959 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
963 result[0] -=
static_cast<Tpoly
>(rhs);
967 template<
class T,
int N>
981 template<
class T,
int N>
986 for(
size_t i = 0; i < lhs.
size(); ++i){
993 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
998 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1000 return (rhs *
static_cast<Tpoly
>(lhs));
1006 template<
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1013 template<
typename T,
int N>
1025 RequireInitialization = 1,
1040 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1041 struct ScalarBinaryOpTraits<
1044 internal::scalar_sum_op<Tscalar, controlpp::FixedPolynom<Tpoly, N>>>
1046 using ReturnType =
decltype(std::declval<Tscalar>() + std::declval<controlpp::FixedPolynom<Tpoly, N>>());
1049 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1050 struct ScalarBinaryOpTraits<
1053 internal::scalar_sum_op<controlpp::FixedPolynom<Tpoly, N>, Tscalar>>
1055 using ReturnType =
decltype(std::declval<controlpp::FixedPolynom<Tpoly, N>>() + std::declval<Tscalar>());
1058 template <
class Tpoly,
int N>
1059 struct ScalarBinaryOpTraits<
1062 internal::scalar_sum_op<controlpp::FixedPolynom<Tpoly, N>, controlpp::FixedPolynom<Tpoly, N>>>
1070 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1071 struct ScalarBinaryOpTraits<
1074 internal::scalar_difference_op<Tscalar, controlpp::FixedPolynom<Tpoly, N>>>
1076 using ReturnType =
decltype(std::declval<Tscalar>() - std::declval<controlpp::FixedPolynom<Tpoly, N>>());
1079 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1080 struct ScalarBinaryOpTraits<
1083 internal::scalar_difference_op<controlpp::FixedPolynom<Tpoly, N>, Tscalar>>
1085 using ReturnType =
decltype(std::declval<controlpp::FixedPolynom<Tpoly, N>>() - std::declval<Tscalar>());
1088 template <
class Tpoly,
int N>
1089 struct ScalarBinaryOpTraits<
1092 internal::scalar_difference_op<controlpp::FixedPolynom<Tpoly, N>, controlpp::FixedPolynom<Tpoly, N>>>
1100 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1101 struct ScalarBinaryOpTraits<
1104 internal::scalar_product_op<Tscalar, controlpp::FixedPolynom<Tpoly, N>>>
1106 using ReturnType =
decltype(std::declval<Tscalar>() * std::declval<controlpp::FixedPolynom<Tpoly, N>>());
1109 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1110 struct ScalarBinaryOpTraits<
1113 internal::scalar_product_op<controlpp::FixedPolynom<Tpoly, N>, Tscalar>>
1115 using ReturnType =
decltype(std::declval<controlpp::FixedPolynom<Tpoly, N>>() * std::declval<Tscalar>());
1118 template <
class Tpoly,
int N>
1119 struct ScalarBinaryOpTraits<
1122 internal::scalar_product_op<controlpp::FixedPolynom<Tpoly, N>, controlpp::FixedPolynom<Tpoly, N>>>
1130 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1131 struct ScalarBinaryOpTraits<
1134 internal::scalar_quotient_op<Tscalar, controlpp::FixedPolynom<Tpoly, N>>>
1136 using ReturnType =
decltype(std::declval<Tscalar>() / std::declval<controlpp::FixedPolynom<Tpoly, N>>());
1139 template <
class Tpoly, std::convertible_to<Tpoly> Tscalar,
int N>
1140 struct ScalarBinaryOpTraits<
1143 internal::scalar_quotient_op<controlpp::FixedPolynom<Tpoly, N>, Tscalar>>
1145 using ReturnType =
decltype(std::declval<controlpp::FixedPolynom<Tpoly, N>>() / std::declval<Tscalar>());
1148 template <
class Tpoly,
int N>
1149 struct ScalarBinaryOpTraits<
1152 internal::scalar_quotient_op<controlpp::FixedPolynom<Tpoly, N>, controlpp::FixedPolynom<Tpoly, N>>>
Describes a mathematical polynomial of fixed size.
Definition Polynom.hpp:665
const vector_type & vector() const
Returns the underlying vector that holds the values.
Definition Polynom.hpp:831
size_t order() const
returns the order of the polynomial
Definition Polynom.hpp:841
FixedPolynom & operator=(const Eigen::Vector< T, Order+1 > &vector)
Assigns the values of a vector to this polynomial.
Definition Polynom.hpp:787
T & at(size_t i)
Access elements at the i-th position.
Definition Polynom.hpp:823
FixedPolynom & operator=(const FixedPolynom &)=default
Copy assignment operator.
FixedPolynom(const Eigen::Vector< T, M > &vector)
Definition Polynom.hpp:741
T & operator[](size_t i)
Access elements at the i-th position.
Definition Polynom.hpp:813
FixedPolynom & operator=(const T(&values)[Order+1])
Definition Polynom.hpp:751
const T & operator[](size_t i) const
Access elements at the i-th position.
Definition Polynom.hpp:808
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
FixedPolynom(const Eigen::Vector< T, Order+1 > &vector)
Constructs a polynomial from a vector.
Definition Polynom.hpp:737
FixedPolynom(const Polynom< T, M > &poly)
Definition Polynom.hpp:773
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
FixedPolynom(const FixedPolynom< T, M > &other)
Definition Polynom.hpp:688
FixedPolynom(const T(&values)[Order+1])
Constructs a polynomial from an array.
Definition Polynom.hpp:717
FixedPolynom()=default
decault constructs the polynomials with the default values of their data type
Eigen::Vector< T, Order+1 > vector_type
Definition Polynom.hpp:668
vector_type & vector()
Returns the underlying vector that holds the values.
Definition Polynom.hpp:827
T value_type
Definition Polynom.hpp:667
FixedPolynom(const FixedPolynom &)=default
Copy constructor.
friend std::ostream & operator<<(std::ostream &stream, const FixedPolynom &poly)
prints the polynomial (pretty) to an output stream with "x" as the symbol name of the variable
Definition Polynom.hpp:873
FixedPolynom(const U &value)
Definition Polynom.hpp:682
size_t size() const
returns the size of the polynomial
Definition Polynom.hpp:836
FixedPolynom(const T(&values)[M])
Definition Polynom.hpp:725
FixedPolynom(const Polynom< T, Order > &poly)
Definition Polynom.hpp:769
Describes a mathematical polynomial.
Definition Polynom.hpp:39
T & operator[](size_t i)
Access elements at the i-th position.
Definition Polynom.hpp:194
void setZero()
sets all entries to zero
Definition Polynom.hpp:226
void print(std::ostream &stream, std::function< std::string(int i)> var) const
Definition Polynom.hpp:371
bool is_zero(T epsilon=std::numeric_limits< T >::min()) const
Checks if every element in the polynomial is zero.
Definition Polynom.hpp:331
size_t size() const
returns the size of the polynomial
Definition Polynom.hpp:207
Polynom & operator/=(const U &num)
Definition Polynom.hpp:433
Eigen::Vector< T, eigen_vector_size > vector_type
Definition Polynom.hpp:43
T value_type
Definition Polynom.hpp:41
T operator()(const T &x) const
Evaluates the polynomial at position x
Definition Polynom.hpp:245
friend std::ostream & operator<<(std::ostream &stream, const Polynom &poly)
prints the polynomial (pretty) to an output stream with "x" as the symbol name of the variable
Definition Polynom.hpp:403
const T & at(size_t i) const
Access elements at the i-th position.
Definition Polynom.hpp:179
Polynom(Args &&... args)
Definition Polynom.hpp:74
Polynom(Args &&... args)
Definition Polynom.hpp:70
Polynom(const T *values, size_t length)
Constructs a dynamically sized polynomial from an array.
Definition Polynom.hpp:119
const T & operator[](size_t i) const
Access elements at the i-th position.
Definition Polynom.hpp:189
Polynom(const T(&array)[M])
Constructs a dynamically sized polynomial from an array.
Definition Polynom.hpp:139
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
Polynom(const T(&array)[M])
Constructs a polynomial from an array.
Definition Polynom.hpp:104
Polynom & operator=(const Polynom &)=default
Copy assignment operator from polynomials with equal compile time size.
vector_type & vector()
Returns the underlying vector that holds the values.
Definition Polynom.hpp:198
Eigen::Vector< T, M > eval(const Eigen::Vector< T, M > &x_vec) const
Evaluates the polynomial at positions of the vector x_vec
Definition Polynom.hpp:255
Polynom(const Polynom &)=default
Copy constructor.
static constexpr int eigen_vector_size
Definition Polynom.hpp:42
size_t order() const
returns the order of the polynomial
Definition Polynom.hpp:212
Polynom()=default
decault constructs the polynomials with the default values of their data type
T eval(const T &x) const
Evaluates the polynomial at position x.
Definition Polynom.hpp:232
const vector_type & vector() const
Returns the underlying vector that holds the values.
Definition Polynom.hpp:202
Polynom & operator*=(const U &num)
Definition Polynom.hpp:427
Polynom(const Eigen::Vector< T, M > &vector)
Definition Polynom.hpp:172
T & at(size_t i)
Access elements at the i-th position.
Definition Polynom.hpp:184
Polynom(const U &vector_expression)
Definition Polynom.hpp:150
std::complex< T > eval(const std::complex< T > &x) const
Evaluates the polynomial at position x.
Definition Polynom.hpp:281
Polynom(const T(&array)[M])
Constructs a polynomial from an array.
Definition Polynom.hpp:98
Polynom(const Eigen::Vector< U, Eigen::Dynamic > &vector)
Definition Polynom.hpp:166
Polynom(const Polynom< T, OtherOrder > &other)
Definition Polynom.hpp:58
Eigen::Vector< std::complex< T >, M > eval(const Eigen::Vector< std::complex< T >, M > &x_vec) const
Evaluates the polynomial at positions of the vector x_vec
Definition Polynom.hpp:304
const Eigen::Vector< T, Eigen::Dynamic > & values(const Bode< T > &bode)
Returns the complex values of the bode data.
Definition Bode.hpp:521
Bode< T > operator+(const Bode< T > &l, const Bode< T > &r)
Adds two bode plots together.
Definition Bode.hpp:846
Definition Polynom.hpp:1012
const Polynom< T, 1 > x(0, 1)
The main namespace for the Control++ library.
Definition Bode.cpp:3
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
Eigen::Matrix< T, N-1, N-1 > companion(const Eigen::Vector< T, N > &v)
Creates a companion matrix from a vector.
Definition math.hpp:314
bool operator!=(const Polynom< T, N > &lhs, const Polynom< T, N > &rhs)
Definition Polynom.hpp:523
static Self dummy_precision()
Definition Polynom.hpp:1032
static Self lowest()
Definition Polynom.hpp:1034
static Self highest()
Definition Polynom.hpp:1033
static Self epsilon()
Definition Polynom.hpp:1031
decltype(std::declval< Tscalar >()/std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1136
decltype(std::declval< Tscalar >()+std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1046
decltype(std::declval< Tscalar >() *std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1106
decltype(std::declval< Tscalar >() - std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1076
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >() - std::declval< Tscalar >()) ReturnType
Definition Polynom.hpp:1085
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >() *std::declval< Tscalar >()) ReturnType
Definition Polynom.hpp:1115
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >()/std::declval< Tscalar >()) ReturnType
Definition Polynom.hpp:1145
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >()+std::declval< Tscalar >()) ReturnType
Definition Polynom.hpp:1055
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >()/std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1154
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >()+std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1064
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >() *std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1124
decltype(std::declval< controlpp::FixedPolynom< Tpoly, N > >() - std::declval< controlpp::FixedPolynom< Tpoly, N > >()) ReturnType
Definition Polynom.hpp:1094