Controlpp
Loading...
Searching...
No Matches
TransferFunction.hpp
Go to the documentation of this file.
1#pragma once
2
3// std
4#include <initializer_list>
5
6#include "Polynom.hpp"
7
8namespace controlpp
9{
10 template<class T, int NumOrder, int DenOrder>
12 public:
13 using value_type = T;
18
19 private:
20 num_type _num;
21 den_type _den;
22
23 public:
24 constexpr TransferFunction() = default;
25 constexpr TransferFunction(const TransferFunction&) = default;
26 constexpr TransferFunction& operator=(const TransferFunction&) = default;
27
28 template<int NumOrder2, int DenOrder2>
29 requires(((NumOrder2 < NumOrder) || (DenOrder2 < DenOrder)) && (NumOrder2 <= NumOrder) && (DenOrder2 <= DenOrder))
30 TransferFunction(const TransferFunction<T, NumOrder2, DenOrder2>& other)
31 : TransferFunction(other.num(), other.den()){}
32
33 template<int NumOrder2, int DenOrder2>
34 requires(((NumOrder2 < NumOrder) || (DenOrder2 < DenOrder)) && (NumOrder2 <= NumOrder) && (DenOrder2 <= DenOrder))
35 TransferFunction& operator=(const TransferFunction<T, NumOrder2, DenOrder2>& other){
36 this->num() = other.num();
37 this->den() = other.den();
38 return *this;
39 }
40
42 : _num(num)
43 , _den(den){}
44
46 : _num(num)
47 , _den(den){}
48
49 constexpr TransferFunction(const T(&num)[NumOrder+1], const T(&den)[DenOrder+1])
50 : _num(num)
51 , _den(den){}
52
57 constexpr Polynom<T, NumOrder>& num() {return this->_num;}
58
63 constexpr const Polynom<T, NumOrder>& num() const {return this->_num;}
64
70 constexpr T& num(size_t i) {return this->_num.at(i);}
71
77 constexpr const T& num(size_t i) const {return this->_num.at(i);}
78
83 constexpr Polynom<T, DenOrder>& den() {return this->_den;}
84
89 constexpr const Polynom<T, DenOrder>& den() const {return this->_den;}
90
96 constexpr T& den(size_t i) {return this->_den.at(i);}
97
103 constexpr const T& den(size_t i) const {return this->_den.at(i);}
104
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;
114 return result;
115 }
116
122 template<int M>
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(); // element wise division
127 return result;
128 }
129
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;
139 return result;
140 }
141
147 template<int M>
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(); // element wise division
152 return result;
153 }
154
163 constexpr std::complex<T> eval_frequency(const T& frequency) const {
164 const std::complex<T> jw(0, frequency);
165 const std::complex<T> result = this->eval(jw);
166 return result;
167 }
168
174 constexpr std::complex<T> eval_frequency_Hz(const T& frequency) const {
175 return this->eval_frequency(frequency * static_cast<T>(2) * std::numbers::pi_v<T>);
176 }
177
183 template<int M>
184 constexpr Eigen::Vector<std::complex<T>, M> eval_frequencies(const Eigen::Vector<T, M>& frequencies) const {
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);
188 return result;
189 }
190
196 template<int M>
197 constexpr Eigen::Vector<std::complex<T>, M> eval_frequencies_hz(const Eigen::Vector<T, M>& frequencies) const {
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);
201 return result;
202 }
203
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);
207 }
208
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);
212 }
213
214 friend std::ostream& operator<<(std::ostream& stream, const TransferFunction& rpoly){
215 rpoly.print(stream);
216 return stream;
217 }
218 };
219
220 // -----------------------------------------------------------------------------------------------
221 // Comparison Operators
222 // -----------------------------------------------------------------------------------------------
223
224 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
226 return ((lhs.num() == rhs.num()) && (lhs.den() == rhs.den()));
227 }
228
229 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
231 return ((lhs.num() != rhs.num()) || (lhs.den() != rhs.den()));
232 }
233
234 // -----------------------------------------------------------------------------------------------
235 // Arithmetic Operators
236 // -----------------------------------------------------------------------------------------------
237
238 // operator +
239 // -----------
240
258 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
259 constexpr TransferFunction<T, std::max(NumOrder1 + DenOrder2, NumOrder2 + DenOrder1), DenOrder1 + DenOrder2> operator+(const TransferFunction<T, NumOrder1, DenOrder1>& lhs, const TransferFunction<T, NumOrder2, DenOrder2>& rhs){
261 }
262
263 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
264 constexpr TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder> operator+(const Tscalar& lhs, const TransferFunction<T, NumOrder, DenOrder>& rhs){
265 return TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder>(static_cast<T>(lhs) * rhs.den() + rhs.num(), rhs.den());
266 }
267
268 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
269 constexpr TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder> operator+(const TransferFunction<T, NumOrder, DenOrder>& lhs, const Tscalar& rhs){
270 return TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder>(lhs.num() + lhs.den() * static_cast<T>(rhs), lhs.den());
271 }
272
273 // operator -
274 // -----------
275
276 template<class T, int NumOrder1, int DenOrder1>
280
281 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
282 constexpr TransferFunction<T, std::max(NumOrder1 + DenOrder2, NumOrder2 + DenOrder1), DenOrder1 + DenOrder2> operator-(const TransferFunction<T, NumOrder1, DenOrder1>& lhs, const TransferFunction<T, NumOrder2, DenOrder2>& rhs){
284 }
285
286
287 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
288 constexpr TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder> operator-(const Tscalar& lhs, const TransferFunction<T, NumOrder, DenOrder>& rhs){
289 return TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder>(static_cast<T>(lhs) * rhs.den() - rhs.num(), rhs.den());
290 }
291
292 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
293 constexpr TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder> operator-(const TransferFunction<T, NumOrder, DenOrder>& lhs, const Tscalar& rhs){
294 return TransferFunction<T, std::max(NumOrder, DenOrder), DenOrder>(lhs.num() - lhs.den() * static_cast<T>(rhs), lhs.den());
295 }
296
297 // operator *
298 // -----------
299
300 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
304
305
306 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
308 return TransferFunction<T, NumOrder, DenOrder>(static_cast<T>(lhs) * rhs.num(), rhs.den());
309 }
310
311 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
313 return TransferFunction<T, NumOrder, DenOrder>(lhs.num() * static_cast<T>(rhs), lhs.den());
314 }
315
316 // operator /
317 // -----------
318
319 template<class T, int NumOrder1, int DenOrder1, int NumOrder2, int DenOrder2>
323
324 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
326 return TransferFunction<T, DenOrder, NumOrder>(static_cast<T>(lhs) * rhs.den(), rhs.num());
327 }
328
329 template<class T, std::convertible_to<T> Tscalar, int NumOrder, int DenOrder>
331 TransferFunction result(lhs.num() / static_cast<T>(rhs), lhs.den());
332 return result;
333 }
334
335 // -----------------------------------------------------------------------------------------------
336 // analysis
337 // -----------------------------------------------------------------------------------------------
338
339 template<class T, int NumOrder, int DenOrder>
340 Eigen::Vector<std::complex<T>, NumOrder+1> zeros(const TransferFunction<T, NumOrder, DenOrder>& tf){
341 return zeros(tf.num());
342 }
343
344 template<class T, int NumOrder, int DenOrder>
345 Eigen::Vector<std::complex<T>, DenOrder+1> poles(const TransferFunction<T, NumOrder, DenOrder>& tf){
346 return zeros(tf.den());
347 }
348
352
360 template<class T, int N>
362 public:
363 using value_type = T;
368
369 private:
370 num_type _num;
371 den_type _den;
372
373 public:
374 constexpr FixedRationalPolynom() = default;
375 constexpr FixedRationalPolynom(const FixedRationalPolynom&) = default;
377
378 template<std::convertible_to<T> U>
379 constexpr FixedRationalPolynom(const U& scalar){
380 this->_num.setZero();
381 this->_num.at(0) = static_cast<T>(scalar);
382 this->_den.setZero();
383 this->_den.at(0) = static_cast<T>(0);
384 }
385
387 : _num(num)
388 , _den(den){}
389
391 : _num(num)
392 , _den(den){}
393
395 : _num(num)
396 , _den(den){}
397
398 constexpr FixedRationalPolynom(const T(&num)[N], const T(&den)[N])
399 : _num(num)
400 , _den(den){}
401
402 constexpr operator TransferFunction<T, N, N> () const {
403 return TransferFunction<T, N, N>(this->_num, this->_den);
404 }
405
407 return TransferFunction<T, N, N>(this->_num, this->_den);
408 }
409
410 constexpr num_type& num() {return this->_num;}
411 constexpr const num_type& num() const {return this->_num;}
412
413 constexpr den_type& den() {return this->_den;}
414 constexpr const den_type& den() const {return this->_den;}
415
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';
419 }
420
421 friend std::ostream& operator<<(std::ostream& stream, const FixedRationalPolynom& rpoly){
422 rpoly.print(stream);
423 return stream;
424 }
425 };
426 // -----------------------------------------------------------------------------------------------
427 // Comparison Operators
428 // -----------------------------------------------------------------------------------------------
429
430 template<class T, int N>
432 return ((lhs.num() == rhs.num()) && (lhs.den() == rhs.den()));
433 }
434
435 template<class T, int N>
437 return ((lhs.num() != rhs.num()) || (lhs.den() != rhs.den()));
438 }
439
440 // -----------------------------------------------------------------------------------------------
441 // Arithmetic Operators
442 // -----------------------------------------------------------------------------------------------
443
444 // operator +
445 // -----------
446
464 template<class T, int N>
466 return FixedRationalPolynom(lhs.num() * rhs.den() + rhs.num() * lhs.den(), lhs.den() * rhs.den());
467 }
468
469 template<class T, std::convertible_to<T> Tscalar, int N>
470 constexpr auto operator+(const Tscalar& lhs, const FixedRationalPolynom<T, N>& rhs){
471 return FixedRationalPolynom(static_cast<T>(lhs) * rhs.den() + rhs.num(), rhs.den());
472 }
473
474 template<class T, std::convertible_to<T> Tscalar, int N>
475 constexpr auto operator+(const FixedRationalPolynom<T, N>& lhs, const Tscalar& rhs){
476 return FixedRationalPolynom(lhs.num() + lhs.den() * static_cast<T>(rhs), lhs.den());
477 }
478
479 // operator -
480 // -----------
481
482 template<class T, int N>
484 return FixedRationalPolynom<T, N>(-poly.num(), poly.den());
485 }
486
487 template<class T, int N>
489 return FixedRationalPolynom(lhs.num() * rhs.den() - rhs.num() * lhs.den(), lhs.den() * rhs.den());
490 }
491
492
493 template<class T, std::convertible_to<T> Tscalar, int N>
494 constexpr auto operator-(const Tscalar& lhs, const FixedRationalPolynom<T, N>& rhs){
495 return FixedRationalPolynom(static_cast<T>(lhs) * rhs.den() - rhs.num(), rhs.den());
496 }
497
498 template<class T, std::convertible_to<T> Tscalar, int N>
499 constexpr auto operator-(const FixedRationalPolynom<T, N>& lhs, const Tscalar& rhs){
500 return FixedRationalPolynom(lhs.num() - lhs.den() * static_cast<T>(rhs), lhs.den());
501 }
502
503 // operator *
504 // -----------
505
506 template<class T, int N>
508 return FixedRationalPolynom(lhs.num() * rhs.num(), lhs.den() * rhs.den());
509 }
510
511
512 template<class T, std::convertible_to<T> Tscalar, int N>
513 constexpr FixedRationalPolynom<T, N> operator*(const Tscalar& lhs, const FixedRationalPolynom<T, N>& rhs){
514 return FixedRationalPolynom(static_cast<T>(lhs) * rhs.num(), rhs.den());
515 }
516
517 template<class T, std::convertible_to<T> Tscalar, int N>
518 constexpr FixedRationalPolynom<T, N> operator*(const FixedRationalPolynom<T, N>& lhs, const Tscalar& rhs){
519 return FixedRationalPolynom(lhs.num() * static_cast<T>(rhs), lhs.den());
520 }
521
522 // operator /
523 // -----------
524
525 template<class T, int N>
527 return FixedRationalPolynom(lhs.num() * rhs.den(), rhs.den() * rhs.num());
528 }
529
530 template<class T, std::convertible_to<T> Tscalar, int N>
531 constexpr auto operator/(const Tscalar& lhs, const FixedRationalPolynom<T, N>& rhs){
532 return FixedRationalPolynom(static_cast<T>(lhs) * rhs.den(), rhs.num());
533 }
534
535 template<class T, std::convertible_to<T> Tscalar, int N>
536 constexpr auto operator/(const FixedRationalPolynom<T, N>& lhs, const Tscalar& rhs){
537 return FixedRationalPolynom(lhs.num() / static_cast<T>(rhs), rhs.den());
538 }
539
540} // namespace controlpp
541
542
543namespace Eigen {
544 template<typename T, int N>
545 struct NumTraits<controlpp::FixedRationalPolynom<T, N>> {
547 using Real = Self; // or T if you want to treat real parts differently
549 using Literal = Self;
550 using Nested = Self;
551
552 enum {
553 IsComplex = 0,
554 IsInteger = 0,
555 IsSigned = 1,
556 RequireInitialization = 1,
557 ReadCost = 1,
558 AddCost = 5,
559 MulCost = 10
560 };
561
562 static inline Self epsilon() { return Self(); }
563 static inline Self dummy_precision() { return Self(); }
564 static inline Self highest() { return Self(); }
565 static inline Self lowest() { return Self(); }
566 };
567
568 // ResultType for operator +
569 // -------------------------
570
571 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
572 struct ScalarBinaryOpTraits<
573 Tscalar,
574 controlpp::FixedRationalPolynom<Tpoly, N>,
575 internal::scalar_sum_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
576 {
577 using ReturnType = decltype(std::declval<Tscalar>() + std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
578 };
579
580 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
581 struct ScalarBinaryOpTraits<
582 controlpp::FixedRationalPolynom<Tpoly, N>,
583 Tscalar,
584 internal::scalar_sum_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
585 {
586 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() + std::declval<Tscalar>());
587 };
588
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>>>
594 {
595 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() + std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
596 };
597
598 // ResultType for operator -
599 // -------------------------
600
601 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
602 struct ScalarBinaryOpTraits<
603 Tscalar,
604 controlpp::FixedRationalPolynom<Tpoly, N>,
605 internal::scalar_difference_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
606 {
607 using ReturnType = decltype(std::declval<Tscalar>() - std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
608 };
609
610 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
611 struct ScalarBinaryOpTraits<
612 controlpp::FixedRationalPolynom<Tpoly, N>,
613 Tscalar,
614 internal::scalar_difference_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
615 {
616 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() - std::declval<Tscalar>());
617 };
618
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>>>
624 {
625 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() - std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
626 };
627
628 // ResultType for operator *
629 // -------------------------
630
631 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
632 struct ScalarBinaryOpTraits<
633 Tscalar,
634 controlpp::FixedRationalPolynom<Tpoly, N>,
635 internal::scalar_product_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
636 {
637 using ReturnType = decltype(std::declval<Tscalar>() * std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
638 };
639
640 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
641 struct ScalarBinaryOpTraits<
642 controlpp::FixedRationalPolynom<Tpoly, N>,
643 Tscalar,
644 internal::scalar_product_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
645 {
646 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() * std::declval<Tscalar>());
647 };
648
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>>>
654 {
655 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() * std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
656 };
657
658 // ResultType for operator /
659 // -------------------------
660
661 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
662 struct ScalarBinaryOpTraits<
663 Tscalar,
664 controlpp::FixedRationalPolynom<Tpoly, N>,
665 internal::scalar_quotient_op<Tscalar, controlpp::FixedRationalPolynom<Tpoly, N>>>
666 {
667 using ReturnType = decltype(std::declval<Tscalar>() / std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
668 };
669
670 template <class Tpoly, std::convertible_to<Tpoly> Tscalar, int N>
671 struct ScalarBinaryOpTraits<
672 controlpp::FixedRationalPolynom<Tpoly, N>,
673 Tscalar,
674 internal::scalar_quotient_op<controlpp::FixedRationalPolynom<Tpoly, N>, Tscalar>>
675 {
676 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() / std::declval<Tscalar>());
677 };
678
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>>>
684 {
685 using ReturnType = decltype(std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>() / std::declval<controlpp::FixedRationalPolynom<Tpoly, N>>());
686 };
687}// Eigen
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