def test_balreal(): isys = Lowpass(0.05) noise = 0.5*Lowpass(0.01) + 0.5*Alpha(0.005) p = 0.8 sys = p*isys + (1-p)*noise balsys, S = balreal(sys) assert balsys == sys assert np.all(S >= 0) assert np.all(S[0] > 0.3) assert np.all(S[1:] < 0.05) assert np.allclose(sorted(S, reverse=True), S) P = control_gram(balsys) Q = observe_gram(balsys) diag = np.diag_indices(len(P)) offdiag = np.ones_like(P, dtype=bool) offdiag[diag] = False offdiag = np.where(offdiag) assert np.allclose(P[diag], S) assert np.allclose(P[offdiag], 0) assert np.allclose(Q[diag], S) assert np.allclose(Q[offdiag], 0)
def test_modred(rng): dt = 0.001 isys = Lowpass(0.05) noise = 0.5*Lowpass(0.01) + 0.5*Alpha(0.005) p = 0.999 sys = p*isys + (1-p)*noise balsys, S = balreal(sys) delsys = modred(balsys, S.argmax()) assert delsys.order_den == 1 u = rng.normal(size=2000) expected = apply_filter(sys, dt, u) actual = apply_filter(delsys, dt, u) assert rmse(expected, actual) < 1e-4 step = np.zeros(2000) step[50:] = 1.0 dcsys = modred(balsys, S.argmax(), method='dc') expected = apply_filter(sys, dt, step) actual = apply_filter(dcsys, dt, step) assert rmse(expected, actual) < 1e-4
def test_hankel(sys): assert np.allclose(hankel(sys), balreal(sys)[1])