1#ifndef CONSTFILT_STABILITY_HPP
2#define CONSTFILT_STABILITY_HPP
4#include "discretize.hpp"
5#include "vendor/consteig/consteig.hpp"
27template <
typename T, consteig::Size N>
28constexpr Stability check_stability(
const StateSpace<T, N> &sys)
30 const auto evals = consteig::eigenvalues(sys.A);
38 constexpr T tol =
static_cast<T
>(1e-8);
40 bool has_imag_axis =
false;
42 for (consteig::Size i = 0; i < N; ++i)
44 const T re = evals(i, 0).real;
47 return Stability::Unstable;
58 for (consteig::Size i = 0; i < N; ++i)
60 if (evals(i, 0).real > -tol)
62 const T im_i = evals(i, 0).imag;
63 for (consteig::Size j = i + 1u; j < N; ++j)
65 if (evals(j, 0).real > -tol)
67 const T diff = im_i - evals(j, 0).imag;
69 diff < static_cast<T>(0) ? -diff : diff;
71 return Stability::Unstable;
76 return Stability::MarginallyStable;
79 return Stability::Stable;