summaryrefslogtreecommitdiffstats
path: root/src/control.cpp.old
blob: 0e0d6413b871e6f9eb3f0f5385151b57c50dd509 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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: