summaryrefslogtreecommitdiffstats
path: root/src/control.cpp.old
diff options
context:
space:
mode:
Diffstat (limited to 'src/control.cpp.old')
-rw-r--r--src/control.cpp.old46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/control.cpp.old b/src/control.cpp.old
new file mode 100644
index 0000000..0e0d641
--- /dev/null
+++ b/src/control.cpp.old
@@ -0,0 +1,46 @@
+#include "control.h"
+
+#include "EigenUnsupported/MatrixFunctions"
+
+namespace ct
+{
+ template<typename T>
+ template<int n, int m, int k>
+ TimeSeries<T>::TimeSeries(size_t nsamples, T start, T end, const SSModel<T, n, m, k>& 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<typename T, int n, int m, int k>
+ void response(SSModel<T, n, m, k> ss, TimeSeries<T>& 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<T, n, n> 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<T, n, m> 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<typename T, int n, int m, int k>
+ void step(SSModel<T, n, m, k> ss, TimeSeries<T>& ts)
+ {
+ ts.u.fill(static_cast<T>(1));
+ response(ss, ts);
+ }
+}
+
+// vim: ts=2 sw=2 noet: