我有矩阵 A 和 B。我想计算 Wikipedia 上定义的可控性 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 还是有更好的库来解决这个问题?我想听听你的建议!