From a03ed38c1dbfefe68c084a8239c3465a90e424d4 Mon Sep 17 00:00:00 2001 From: Johannes Kaisinger Date: Wed, 3 Jul 2024 20:42:18 +0200 Subject: [PATCH 1/2] Fix impuse response, input data only contains one inpute[0]==1 in each trace --- control/timeresp.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control/timeresp.py b/control/timeresp.py index 81b2030b3..d4db83812 100644 --- a/control/timeresp.py +++ b/control/timeresp.py @@ -1960,7 +1960,7 @@ def impulse_response(sys, T=None, input=None, output=None, T_num=None, yout[:, inpidx, :] = response.y if output is None \ else response.y[output] xout[:, inpidx, :] = response.x - uout[:, inpidx, :] = U[i] + uout[:, inpidx, :] = U if input is None else U[i] # Figure out if the system is SISO or not issiso = sys.issiso() or (input is not None and output is not None) From 7624aeb774d5aeeefa5224dc5f087a869e4c3bd4 Mon Sep 17 00:00:00 2001 From: Johannes Kaisinger Date: Thu, 4 Jul 2024 10:23:50 +0200 Subject: [PATCH 2/2] Add regression test for discrete impulse response input --- control/tests/timeresp_test.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/control/tests/timeresp_test.py b/control/tests/timeresp_test.py index bdbbb3e89..73032c0a8 100644 --- a/control/tests/timeresp_test.py +++ b/control/tests/timeresp_test.py @@ -536,6 +536,32 @@ def test_discrete_time_impulse(self, tsystem): sysdt = sys.sample(dt, 'impulse') np.testing.assert_array_almost_equal(impulse_response(sys, t)[1], impulse_response(sysdt, t)[1]) + + def test_discrete_time_impulse_input(self): + # discrete time impulse input, Only one active input for each trace + A = [[.5, 0.25],[.0, .5]] + B = [[1., 0,],[0., 1.]] + C = [[1., 0.],[0., 1.]] + D = [[0., 0.],[0., 0.]] + dt = True + sysd = ct.ss(A,B,C,D, dt=dt) + response = ct.impulse_response(sysd,T=dt*3) + + Uexpected = np.zeros((2,2,4), dtype=float).astype(object) + Uexpected[0,0,0] = 1./dt + Uexpected[1,1,0] = 1./dt + + np.testing.assert_array_equal(response.inputs,Uexpected) + + dt = 0.5 + sysd = ct.ss(A,B,C,D, dt=dt) + response = ct.impulse_response(sysd,T=dt*3) + + Uexpected = np.zeros((2,2,4), dtype=float).astype(object) + Uexpected[0,0,0] = 1./dt + Uexpected[1,1,0] = 1./dt + + np.testing.assert_array_equal(response.inputs,Uexpected) @pytest.mark.parametrize("tsystem", ["siso_ss1"], indirect=True) def test_impulse_response_warnD(self, tsystem):