3#include <janus/janus.hpp>
19Eigen::Matrix<double, N, N>
21 static constexpr double b[] = {64764752532480000.0,
36 double norm_A = A.cwiseAbs().colwise().sum().maxCoeff();
39 s = std::max(0,
static_cast<int>(std::ceil(std::log2(norm_A / 5.37))));
41 Eigen::Matrix<double, N, N> As = A / std::pow(2.0, s);
43 Eigen::Matrix<double, N, N> I = Eigen::Matrix<double, N, N>::Identity();
44 Eigen::Matrix<double, N, N> A2 = As * As;
45 Eigen::Matrix<double, N, N> A4 = A2 * A2;
46 Eigen::Matrix<double, N, N> A6 = A4 * A2;
48 Eigen::Matrix<double, N, N> U = b[13] * A6 + b[11] * A4 + b[9] * A2;
50 U = U + b[7] * A6 + b[5] * A4 + b[3] * A2 + b[1] * I;
53 Eigen::Matrix<double, N, N> V = b[12] * A6 + b[10] * A4 + b[8] * A2;
55 V = V + b[6] * A6 + b[4] * A4 + b[2] * A2 + b[0] * I;
57 Eigen::Matrix<double, N, N> P = (V - U).fullPivLu().solve(V + U);
59 for (
int i = 0; i < s; ++i) {
81 const Eigen::Matrix<double, N, 1> &B_c,
double dt,
82 Eigen::Matrix<double, N, N> &A_d,
83 Eigen::Matrix<double, N, 1> &B_d) {
84 constexpr int M = N + 1;
85 Eigen::Matrix<double, M, M> aug = Eigen::Matrix<double, M, M>::Zero();
86 aug.template topLeftCorner<N, N>() = A_c * dt;
87 aug.template block<N, 1>(0, N) = B_c * dt;
90 A_d = exp_aug.template topLeftCorner<N, N>();
91 B_d = exp_aug.template block<N, 1>(0, N);
101 const Eigen::Matrix<double, N, 1> &B_c,
double dt,
102 Eigen::Matrix<double, N, N> &A_d,
103 Eigen::Matrix<double, N, 1> &B_d) {
104 Eigen::Matrix<double, N, N> I = Eigen::Matrix<double, N, N>::Identity();
105 Eigen::Matrix<double, N, N> A_half = A_c * (dt / 2.0);
106 Eigen::FullPivLU<Eigen::Matrix<double, N, N>> lu(I - A_half);
107 A_d = lu.solve(I + A_half);
108 B_d = lu.solve(B_c * dt);
118 const Eigen::Matrix<double, N, 1> &B_c,
double dt,
119 Eigen::Matrix<double, N, N> &A_d,
120 Eigen::Matrix<double, N, 1> &B_d) {
121 Eigen::Matrix<double, N, N> I = Eigen::Matrix<double, N, N>::Identity();
133 const Eigen::Matrix<double, N, 1> &B_c,
134 double dt, Eigen::Matrix<double, N, N> &A_d,
135 Eigen::Matrix<double, N, 1> &B_d) {
136 Eigen::Matrix<double, N, N> I = Eigen::Matrix<double, N, N>::Identity();
137 Eigen::FullPivLU<Eigen::Matrix<double, N, N>> lu(I - A_c * dt);
139 B_d = A_d * B_c * dt;
Transfer function utilities for linear systems and nonlinear elements.
Definition Discretize.hpp:5
void discretize_backward_euler(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Backward Euler discretization.
Definition Discretize.hpp:132
void discretize_zoh(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Zero-order hold (ZOH) discretization.
Definition Discretize.hpp:80
Eigen::Matrix< double, N, N > matrix_exp_pade(const Eigen::Matrix< double, N, N > &A)
Compute matrix exponential using Padé(13,13) approximation.
Definition Discretize.hpp:20
void discretize_tustin(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Tustin (bilinear) discretization.
Definition Discretize.hpp:100
void discretize_euler(const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
Forward Euler discretization.
Definition Discretize.hpp:117