8#include "akreon/linalg/assert.hpp"
11#include "akreon/convex/composed/trace.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"
76template <ContinuousPlantModelLike SFModel>
79 using Model = linalg::remove_cvref_t<SFModel>;
87 using QMat = linalg::Matrix<T, StateDim, StateDim>;
88 using YMat = linalg::Matrix<T, InputDim, StateDim>;
89 using KMat = linalg::Matrix<T, InputDim, StateDim>;
90 using ZMat = linalg::Matrix<T, OutputDim, OutputDim>;
107 template <convex::AtomLike DecVar>
121 template <convex::AtomLike DecVar>
124 static_assert(convex::is_var_type_v<DecVar>,
"Input atom is not a var");
125 using DecVarDom = convex::meta_dom_t<convex::atom_meta_t<DecVar>>;
126 static_assert(convex::dom_vartype_v<DecVarDom> == convex::VarType::FREE,
127 "Merged decision var must be free");
128 static_assert(std::same_as<DecVarSpace, convex::dom_space_t<DecVarDom>>,
129 "Expected merged decision size [svec(Q); vec(Y); svec(Z)]");
147 template <convex::AtomLike DecVar>
151 using Fs = linalg::Vector<FMat, DecVarDim>;
153 auto M_q = [&](
const QMat&
E) -> FMat {
154 const auto& A =
model.dynamics_matrix();
155 return T(-1) * (A *
E +
E * linalg::transpose(A));
158 auto M_y = [&](
const YMat&
E) -> FMat {
159 const auto&
B_u =
model.control_matrix();
160 return T(-1) * (
B_u *
E + linalg::transpose(
E) * linalg::transpose(
B_u));
163 const auto B_w =
model.exogenous_matrix();
164 const auto F_0 =
T(-1) * (
B_w * linalg::transpose(
B_w));
195 template <convex::AtomLike DecVar>
199 using FMat = linalg::Matrix<T, LmiDim, LmiDim>;
200 using Fs = linalg::Vector<FMat, DecVarDim>;
201 auto M_z = [](
const ZMat&
E) -> FMat {
203 return linalg::set_block<0, OutputDim, 0, OutputDim>(
F,
E);
205 auto M_q = [&](
const QMat&
E) -> FMat {
207 const auto C =
model.performance_matrix();
208 F = linalg::set_block<OutputDim, LmiDim, OutputDim, LmiDim>(
F,
E);
209 F = linalg::set_block<0, OutputDim, OutputDim, LmiDim>(
F, C *
E);
210 F = linalg::set_block<OutputDim, LmiDim, 0, OutputDim>(
211 F,
E * linalg::transpose(C));
214 auto M_y = [&](
const YMat&
E) -> FMat {
219 F = linalg::set_block<0, OutputDim, OutputDim, LmiDim>(
F,
D_u *
E);
220 F = linalg::set_block<OutputDim, LmiDim, 0, OutputDim>(
221 F, linalg::transpose(
E) * linalg::transpose(
D_u));
235 for (std::size_t
i = 0;
i <
ZDim; ++
i)
238 const auto I = linalg::make_identity<T, LmiDim>();
251 template <convex::AtomLike DecVar>
253 return convex::make_trace_block<QDim + YDim, linalg::SymmetricMatrix<ZMat>>(
281template <ContinuousPlantModelLike SFModel, convex::AtomLike DecVar>
constexpr auto make_h2_state_feedback_problem(const SFModel &model, const DecVar &Z_hat, plant_type_t< SFModel > margin=1e-6)
make h2 state feedback problem
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 > >::T plant_type_t
extract scalar type from plant
constexpr auto stability_constraint(const SFModel &model, const DecVar &Z_hat) const
stability_constraint
linalg::RowVector< T, DecVarDim > DecVarSpace
linalg::Matrix< T, InputDim, StateDim > YMat
static constexpr std::size_t InputDim
linalg::Matrix< T, StateDim, StateDim > QMat
static constexpr std::size_t StateDim
linalg::Matrix< T, OutputDim, OutputDim > ZMat
constexpr auto objective(const DecVar &Z_hat) const
objective
constexpr auto operator()(const SFModel &model, const DecVar &Z_hat, T margin=1e-6) const
operator overload to form H2 state feedback
static constexpr std::size_t OutputDim
static constexpr std::size_t QDim
static constexpr std::size_t ZDim
linalg::remove_cvref_t< SFModel > Model
extracting alias and types
constexpr auto K(const QMat &Q, const YMat &Y) const
K.
static constexpr std::size_t DecVarDim
linalg::Matrix< T, InputDim, StateDim > KMat
static constexpr std::size_t YDim
constexpr auto z_constraint(const SFModel &model, const DecVar &Z_hat, T margin=1e-6) const
z_constraint
constexpr auto apply(const SFModel &model, const DecVar &Z_hat, T margin=1e-6) const
apply
base type traits for plant model