#include "control.h" #include "EigenUnsupported/MatrixFunctions" namespace ct { template template TimeSeries::TimeSeries(size_t nsamples, T start, T end, const SSModel& ss) : nsamples(nsamples) , start(start) , end(end) , t(nsamples) , u(ss.u.rows(), nsamples) , x(ss.x.rows(), nsamples) , y(ss.y.rows(), nsamples) {} template void response(SSModel ss, TimeSeries& ts) { /* Numerically integrate solution with timestep dt and linear interpolation * between input samples */ using namespace Eigen; T dt = (ts.start - ts.end) / ts.nsamples; Matrix expM = (ss.A * dt).exp(); Index Ad = expM(seq(0,n), seq(0,n)); Index Bd1 = expM(seq(0, n), seq(n + m, last)); Matrix Bd0 = expM(seq(0, n), seq(n, n + m)) - Bd1; for (int i = 1; i < ts.nsamples; i++) ts.x(all, i) = Ad * ts.x(all, i - 1) + Bd0 * ts.u(all, i - 1) + Bd1 * ts.u(all, i); ts.y = ss.C * ts.x + ss.D * ts.u; } template void step(SSModel ss, TimeSeries& ts) { ts.u.fill(static_cast(1)); response(ss, ts); } } // vim: ts=2 sw=2 noet: