206 using FMat = linalg::Matrix<T, LmiDim, LmiDim>;
207 using Fs = linalg::Vector<FMat, DecVarDim>;
209 auto M_q = [&](
const QMat&
E) -> FMat {
211 const auto A =
model.dynamics_matrix();
212 const auto C_z =
model.performance_matrix();
213 F = linalg::set_block<0, StateEnd, 0, StateEnd>(
214 F,
T(-1) * (A *
E +
E * linalg::transpose(A)));
215 F = linalg::set_block<0, StateEnd, DisturbanceEnd, LmiDim>(
216 F,
T(-1) * linalg::transpose(
C_z *
E));
217 F = linalg::set_block<DisturbanceEnd, LmiDim, 0, StateEnd>(
222 auto M_y = [&](
const YMat&
E) -> FMat {
224 const auto B_u =
model.control_matrix();
228 F = linalg::set_block<0, StateEnd, 0, StateEnd>(
229 F,
T(-1) * (
B_u *
E + linalg::transpose(
E) * linalg::transpose(
B_u)));
230 F = linalg::set_block<0, StateEnd, DisturbanceEnd, LmiDim>(
231 F,
T(-1) * linalg::transpose(
D_u *
E));
232 F = linalg::set_block<DisturbanceEnd, LmiDim, 0, StateEnd>(
237 auto M_gamma = [](
const linalg::Matrix<T, 1, 1>&
E) -> FMat {
239 const auto gamma =
E(0, 0);
240 const auto I_w = linalg::make_identity<T, ExogenousDim>();
241 const auto I_z = linalg::make_identity<T, OutputDim>();
242 F = linalg::set_block<StateEnd, DisturbanceEnd, StateEnd, DisturbanceEnd>(
244 F = linalg::set_block<DisturbanceEnd, LmiDim, DisturbanceEnd, LmiDim>(
254 linalg::MatrixPencil<FMat, GammaDim>{}
263 const auto B_w =
model.exogenous_matrix();
267 F_0 = linalg::set_block<0, StateEnd, StateEnd, DisturbanceEnd>(
F_0,
269 F_0 = linalg::set_block<StateEnd, DisturbanceEnd, 0, StateEnd>(
270 F_0,
T(-1) * linalg::transpose(
B_w));
271 F_0 = linalg::set_block<StateEnd, DisturbanceEnd, DisturbanceEnd, LmiDim>(
272 F_0,
T(-1) * linalg::transpose(
D_w));
273 F_0 = linalg::set_block<DisturbanceEnd, LmiDim, StateEnd, DisturbanceEnd>(
276 const auto I = linalg::make_identity<T, LmiDim>();