191 using FMat = linalg::Matrix<T, LmiDim, LmiDim>;
192 using Fs = linalg::Vector<FMat, DecVarDim>;
194 auto M_q = [&](
const QMat&
E) -> FMat {
196 const auto A =
model.dynamics_matrix();
197 const auto B_w =
model.exogenous_matrix();
198 F = linalg::set_block<0, StateEnd, 0, StateEnd>(
199 F,
T(-1) * (linalg::transpose(A) *
E +
E * A));
200 F = linalg::set_block<0, StateEnd, StateEnd, DisturbanceEnd>(
202 F = linalg::set_block<StateEnd, DisturbanceEnd, 0, StateEnd>(
203 F,
T(-1) * linalg::transpose(
B_w) *
E);
207 auto M_w = [&](
const WMat&
E) -> FMat {
209 const auto C_y =
model.measurement_matrix();
212 F = linalg::set_block<0, StateEnd, 0, StateEnd>(
213 F, linalg::transpose(
C_y) * linalg::transpose(
E) +
E *
C_y);
214 F = linalg::set_block<0, StateEnd, StateEnd, DisturbanceEnd>(
F,
E *
D_yw);
215 F = linalg::set_block<StateEnd, DisturbanceEnd, 0, StateEnd>(
216 F, linalg::transpose(
D_yw) * linalg::transpose(
E));
220 auto M_gamma = [](
const linalg::Matrix<T, 1, 1>&
E) -> FMat {
222 const auto gamma =
E(0, 0);
223 const auto I_w = linalg::make_identity<T, ExogenousDim>();
224 const auto I_z = linalg::make_identity<T, PerformanceDim>();
225 F = linalg::set_block<StateEnd, DisturbanceEnd, StateEnd, DisturbanceEnd>(
227 F = linalg::set_block<DisturbanceEnd, LmiDim, DisturbanceEnd, LmiDim>(
237 linalg::MatrixPencil<FMat, GammaDim>{}
246 const auto C_e =
model.performance_matrix();
250 F_0 = linalg::set_block<0, StateEnd, DisturbanceEnd, LmiDim>(
251 F_0,
T(-1) * linalg::transpose(
C_e));
252 F_0 = linalg::set_block<DisturbanceEnd, LmiDim, 0, StateEnd>(
F_0,
254 F_0 = linalg::set_block<StateEnd, DisturbanceEnd, DisturbanceEnd, LmiDim>(
255 F_0,
T(-1) * linalg::transpose(
D_ew));
256 F_0 = linalg::set_block<DisturbanceEnd, LmiDim, StateEnd, DisturbanceEnd>(
259 const auto I = linalg::make_identity<T, LmiDim>();