8#include "akreon/linalg/assert.hpp"
12#include "akreon/convex/convex_problem.hpp"
13#include "akreon/convex/intersection.hpp"
14#include "akreon/convex/sets/lmi.hpp"
15#include "akreon/convex/variable.hpp"
16#include "akreon/linalg/operator/matrix_inverse.hpp"
17#include "akreon/linalg/operator/matrix_pencil.hpp"
47template <ContinuousPlantModelLike SFModel>
50 using Model = linalg::remove_cvref_t<SFModel>;
58 using PMat = linalg::Matrix<T, StateDim, StateDim>;
59 using YMat = linalg::Matrix<T, InputDim, StateDim>;
60 using KMat = linalg::Matrix<T, InputDim, StateDim>;
67 using ZSpace = linalg::RowVector<T, ZDim>;
68 using Fs = linalg::Vector<FMat, ZDim>;
78 template <convex::AtomLike ZVar>
93 template <convex::AtomLike ZVar>
96 static_assert(convex::is_var_type_v<ZVar>,
"Input atom is not a var");
97 using ZDom = convex::meta_dom_t<convex::atom_meta_t<ZVar>>;
98 static_assert(convex::dom_vartype_v<ZDom> == convex::VarType::FREE,
99 "Merged decision var must be free");
100 using ZVarSpace = convex::dom_space_t<ZDom>;
101 static_assert(std::same_as<ZVarSpace, ZSpace>,
102 "Expected merged decision size [svec(P); vec(Y)]");
117 template <convex::AtomLike ZVar>
119 const auto I = linalg::make_identity<T, StateDim>();
139 template <convex::AtomLike ZVar>
141 const ZVar&
Z)
const {
143 const auto A =
model.dynamics_matrix();
144 return T(-1) * (A *
E +
E * linalg::transpose(A));
148 const auto B_u =
model.control_matrix();
149 return T(-1) * (
B_u *
E + linalg::transpose(
E) * linalg::transpose(
B_u));
189template <ContinuousPlantModelLike SFModel, convex::AtomLike ZVar>
208template <ContinuousPlantModelLike SFModel, convex::AtomLike ZVar>
213 return convex::make_problem(
Z).in_set(
constraints).feasibility();
constexpr bool is_continuous_v
check if continuous or not
constexpr auto recover_state_feedback_gain(const PMat &P, const YMat &Y)
recover state-feedback gain from a lifted gain variable
typename plant_traits< linalg::remove_cvref_t< Plant > >::State plant_state_vec_t
extract state vector from plant
typename plant_traits< linalg::remove_cvref_t< Plant > >::T plant_type_t
extract scalar type from plant
constexpr auto make_state_feedback_problem(const SFModel &model, const ZVar &Z, const auto &obj, plant_type_t< SFModel > margin=1e-6)
make state feedback problem
constexpr auto K(const PMat &P, const YMat &Y) const
K.
linalg::Matrix< T, StateDim, StateDim > PMat
static constexpr std::size_t StateDim
linalg::RowVector< T, ZDim > ZSpace
static constexpr std::size_t PDim
static constexpr std::size_t ZDim
constexpr auto operator()(const SFModel &model, const ZVar &Z, T margin=1e-6) const
operator overload (form state feedback)
static constexpr std::size_t InputDim
linalg::Matrix< T, InputDim, StateDim > KMat
linalg::remove_cvref_t< SFModel > Model
extracting alias and types
constexpr auto p_constraint(const ZVar &Z, T margin=1e-6) const
p_constraint
linalg::Matrix< T, InputDim, StateDim > YMat
constexpr auto stability_constraint(const SFModel &model, const ZVar &Z) const
stability_constraint
constexpr auto apply(const SFModel &model, const ZVar &Z, T margin=1e-6) const
apply
linalg::Vector< FMat, ZDim > Fs
plant_state_vec_t< Model > State
static constexpr std::size_t YDim
base type traits for plant model