3#include "core/utils/math/eigen_interface.h"
36template <
int STATES,
int INPUTS>
37EMat<STATES, STATES> DARE(
38 const EMat<STATES, STATES> &A,
const EMat<STATES, INPUTS> &B,
const EMat<STATES, STATES> &Q,
39 const EMat<INPUTS, INPUTS> &R
41 const Eigen::LLT<EMat<INPUTS, INPUTS>> R_llt = R.llt();
42 using StateMatrix = EMat<STATES, STATES>;
56 StateMatrix G_k = B * R_llt.solve(B.transpose());
66 StateMatrix W = StateMatrix::Identity(H_k.rows(), H_k.cols()) + G_k * H_k;
68 auto W_solver = W.lu();
71 StateMatrix V_1 = W_solver.solve(A_k);
86 StateMatrix V_2 = W_solver.solve(G_k.transpose()).transpose();
91 G_k += A_k * V_2 * A_k.transpose();
92 H_k1 = H_k + V_1.transpose() * H_k * A_k;
97 }
while ((H_k1 - H_k).norm() > 1e-10 * H_k1.norm());