def test_bad_filt(): sys = PadeDelay(0.1, order=4).X with pytest.raises(ValueError): sys.filt(np.ones((4, 4))) with pytest.raises(ValueError): sys.filt(np.ones((4, 1)), filtfilt=True) with pytest.raises(ValueError): sys.filt(np.ones((4,)), copy=False)
def test_non_siso_filtering(rng): sys = PadeDelay(0.1, order=4) length = 1000 SIMO = sys.X assert not SIMO.is_SISO assert SIMO.size_in == 1 assert SIMO.size_out == len(sys) x = SIMO.impulse(length) for i, (sub1, sub2) in enumerate(zip(sys, SIMO)): assert sub1 == sub2 y1 = sub1.impulse(length) y2 = sub2.impulse(length) _transclose(shift(y1), shift(y2), x[:, i]) B = np.asarray([[1, 2, 3], [0, 0, 0], [0, 0, 0], [0, 0, 0]]) * sys.B u = rng.randn(length, 3) Bu = u.dot([1, 2, 3]) assert Bu.shape == (length,) MISO = LinearSystem((sys.A, B, sys.C, np.zeros((1, 3))), analog=True) assert not MISO.is_SISO assert MISO.size_in == 3 assert MISO.size_out == 1 y = cont2discrete(MISO, dt=0.001).filt(u) assert y.shape == (length,) assert np.allclose(shift(sys.filt(Bu)), y) MIMO = MISO.X assert not MIMO.is_SISO assert MIMO.size_in == 3 assert MIMO.size_out == 4 y = MIMO.filt(u) I = np.eye(len(sys)) for i, sub1 in enumerate(MIMO): sub2 = LinearSystem((sys.A, B, I[i:i+1], np.zeros((1, 3)))) _transclose(sub1.filt(u), sub2.filt(u), y[:, i])