In [1]:
import sysid
import pylab as pl
%matplotlib inline
%load_ext autoreload
%autoreload 2
In [2]:
ss1 = sysid.StateSpaceDiscreteLinear(
A=0.9, B=0.5, C=1, D=0, Q=0.1, R=0.01, dt=0.1)
ss1
Out[2]:
In [3]:
#np.random.seed(1234)
prbs1 = sysid.prbs(1000)
def f_prbs(t, x, i):
return prbs1[i]
In [4]:
tf = 10
data = ss1.simulate(f_u=f_prbs, x0=np.matrix(0), tf=tf)
ss1_id = sysid.subspace_det_algo1(y=data.y, u=data.u,
f=5, p=5, s_tol=1e-1, dt=ss1.dt)
data_id = ss1_id.simulate(f_u=f_prbs, x0=0, tf=tf)
ss1_id
Out[4]:
In [5]:
pl.plot(data_id.t.T, data_id.x.T, label='id');
pl.plot(data.t.T, data.x.T, label='true');
pl.legend()
pl.grid()
print 'fit {:f}%'.format(100*sysid.subspace.nrms(data_id.y, data.y))
In [10]:
ss2 = sysid.StateSpaceDiscreteLinear(
A=np.matrix([[0,0.1,0.2],[0.2,0.3,0.4],[0.4,0.3,0.2]]),
B=np.matrix([[1,0],[0,1],[0,-1]]),
C=np.matrix([[1,0,0],[0,1,0]]), D=np.matrix([[0,0],[0,0]]),
Q=pl.diag([0.1,0.1,0.1]), R=pl.diag([0.04,0.04]), dt=0.1)
ss2
Out[10]:
In [11]:
np.random.seed(1234)
prbs1 = sysid.prbs(1000)
prbs2 = sysid.prbs(1000)
def f_prbs_2d(t, x, i):
i = i%1000
return 2*np.matrix([prbs1[i]-0.5, prbs2[i]-0.5]).T
In [18]:
tf = 10
data2 = ss2.simulate(
f_u=f_prbs_2d, x0=np.matrix([0,0,0]).T, tf=tf)
ss2_id = sysid.subspace_det_algo1(y=data2.y, u=data2.u,
f=5, p=5, s_tol=0.2, dt=ss2.dt)
data2_id = ss2_id.simulate(
f_u=f_prbs_2d,
x0=np.matrix(pl.zeros(ss2_id.A.shape[0])).T, tf=tf)
ss2_id
Out[18]:
In [20]:
for i in range(2):
pl.figure(figsize=(15,5))
pl.plot(data2_id.t.T, data2_id.y[i,:].T,
label='$y_{:d}$ true'.format(i))
pl.plot(data2.t.T, data2.y[i,:].T,
label='$y_{:d}$ id'.format(i))
pl.legend()
pl.grid()
print 'fit {:f}%'.format(100*sysid.subspace.nrms(
data2_id.y, data2.y))