Интеграция матричной функции с течением времени с Boost / вычисления Gramian управляемости в C ++ - PullRequest
1 голос
/ 03 апреля 2020

У меня есть матрицы A и B. Я хочу вычислить грамматику управляемости, как определено в Википедии: Controllability Gramian

К счастью, Boost уже предоставляет методы интеграции, поэтому я написал следующую функцию :

#include <boost/math/quadrature/gauss.hpp>
#include <unsupported/Eigen/MatrixFunctions>
#include <Eigen/Geometry>

typedef Eigen::Matrix<std::complex<double>, 12, 12> GramianMatrix;

GramianMatrix calcControllabilityGramian(Eigen::Matrix<double, 12, 12> A, Eigen::Matrix<double, 12, 4> B) {
  // the integral function
  auto controllabilityGramianIntegral = [&A, &B](const double & t) -> GramianMatrix {
      return (A * t).exp() * B * B.transpose() * (A.transpose() * t).exp();
  };
  // now do the integration
  boost::math::quadrature::gauss<double, 10> integrator;
  GramianMatrix W_t = integrator.integrate(controllabilityGramianIntegral, 0.0, 1.0);

  return W_t;
}

Похоже, что Boost ожидает, что выход этого интеграла будет двойным значением, а не матрицей. Компилятор выдает следующую ошибку: /usr/local/include/boost/math/quadrature/gauss.hpp:1183:9: No viable conversion from 'double' to 'K' (aka 'Matrix<std::complex<double>, 12, 12>'). Так есть ли способ сделать это с выходом матричного типа? Должен ли я использовать Boost или есть лучшие библиотеки для этой проблемы? Я хотел бы услышать ваши предложения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...