Самый простой способ получить Ai, Bi
- создать экземпляр вашей системы с помощью AutoDiffXd, а именно LeafSystem<AutoDiffXd>
. Следующий код даст вам Ai, Bi
MyLeafSystem<AutoDiffXd> my_system;
Eigen::VectorXd x_val = ...
Eigen::VectorXd u_val = ...
Eigen::VectorXd w_val = ...
// xuw_val concantenate x_val, u_val and w_val
Eigen::VectorXd xuw_val(x_val.rows() + u_val.rows() + w_val.rows());
xuw_val.head(x_val.rows()) = x_val;
xuw_val.segment(x_val.rows(), u_val.rows()) = u_val;
xuw_val.segment(w_val.rows()) = w_val;
// xuw_autodiff stores xuw_val in its value(), and an identity matrix in its gradient()
AutoDiffVecXd xuw_autodiff = math::initializeAutoDiff(xuw_val);
AutoDiffVecXd x_autodiff = xuw_autodiff.head(x_val.rows());
AutoDiffVecXd u_autodiff = xuw_autodiff.segment(x_val.rows(), u_val.rows());
AutoDiffVecXd w_autodiff = xuw_autodiff.tail(u_val.rows());
// I suppose you have a function x[n+1] = dynamics(system, x[n], u[n], w[n]). This dynamics function could be a wrapper of CalcUnrestrictedUpdate function.
AutoDiffVecXd x_next_autodiff = dynamics(my_system, x_autodiff, u_autodiff, w_autodiff);
Eigen::MatrixXd x_next_gradient = math::autoDiffToGradientMatrix(x_next_autodiff);
Eigen::MatrixXd Ai = x_next_gradient.block(0, 0, x_val.rows(), x_val.rows());
Eigen::MatrixXd Bi = x_next_gradient.block(0, x_val.rows(), x_val.rows(), u_val.rows());
Eigen::MatrixXd Gi = x_next_gradient.block(0, x_val.rows() + u_val.rows(), x_val.rows(), w_val.rows());
Таким образом, вы получите значение Ai, Bi, Gi
в конце.
Если вам нужно написать функцию стоимости, вам нужно будет создать подкласс решателей :: Стоимость . Внутри функции Eval
этого производного класса вы реализуете свой код, чтобы сначала вычислить Ai, Bi, Gi, а затем интегрировать уравнение Риккати.
Но я думаю, поскольку ваша функция стоимости зависит от Ai, Bi, Gi
, градиент вашей функции затрат будет зависеть от градиента Ai, Bi, Gi
. В настоящее время мы не предоставляем функцию для вычисления градиента второго порядка динамики.
Насколько сложна ваша динамическая система? Можно ли записать динамику вручную? Если да, то мы можем сделать несколько сокращений, чтобы сгенерировать градиент второго порядка вашей динамики.
@ sherm или другие специалисты по динамике Дрейка, было бы здорово узнать ваше мнение о том, как получить градиент второго порядка (при условии, что Фил сможет подтвердить, что ему действительно нужен градиент второго порядка.)