akreon-control
Optimal and robust control and state estimation in C++26.
Loading...
Searching...
No Matches
gain_recovery.hpp
Go to the documentation of this file.
1/*
2 * Copyright © 2025-2026 Akreon LLC
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
6#pragma once
7
8#include "akreon/linalg/operator/matrix_inverse.hpp"
9
10namespace control {
11
26template <linalg::SquareMatrix PMat, linalg::MatrixContainer YMat>
27constexpr auto recover_state_feedback_gain(const PMat& P, const YMat& Y) {
28 using T = linalg::matrix_scalar_t<PMat>;
29 static constexpr std::size_t InputDim = linalg::mat_rows_v<YMat>;
30 static constexpr std::size_t StateDim = linalg::mat_cols_v<YMat>;
31 static_assert(linalg::mat_rows_v<PMat> == StateDim,
32 "P row dimension must match Y column dimension");
33 static_assert(linalg::mat_cols_v<PMat> == StateDim,
34 "P column dimension must match Y column dimension");
35
36 using KMat = linalg::Matrix<T, InputDim, StateDim>;
37 const auto [P_inv, event] = linalg::SymmetricMatrixInverse<PMat>()(P);
38 if (event != linalg::NumericalEvent::NONE) return std::tuple(KMat{}, event);
39 const auto K = Y * P_inv;
40 return std::tuple(K, linalg::NumericalEvent::NONE);
41}
42
56template <linalg::SquareMatrix QMat, linalg::MatrixContainer WMat>
57constexpr auto recover_state_observer_gain(const QMat& Q, const WMat& W) {
58 using T = linalg::matrix_scalar_t<QMat>;
59 static constexpr std::size_t StateDim = linalg::mat_rows_v<WMat>;
60 static constexpr std::size_t MeasurementDim = linalg::mat_cols_v<WMat>;
61 static_assert(linalg::mat_rows_v<QMat> == StateDim,
62 "Q row dimension must match W row dimension");
63 static_assert(linalg::mat_cols_v<QMat> == StateDim,
64 "Q column dimension must match W row dimension");
65
66 using LMat = linalg::Matrix<T, StateDim, MeasurementDim>;
67 const auto [Q_inv, event] = linalg::SymmetricMatrixInverse<QMat>()(Q);
68 if (event != linalg::NumericalEvent::NONE) return std::tuple(LMat{}, event);
69 const auto L = Q_inv * W;
70 return std::tuple(L, linalg::NumericalEvent::NONE);
71}
72
73} // namespace control
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
constexpr auto recover_state_observer_gain(const QMat &Q, const WMat &W)
recover state-observer gain from a lifted gain variable