From 5c37bdf106fa8138efa44a1095631301e55ee225 Mon Sep 17 00:00:00 2001 From: aWZHY0yQH81uOYvH <32046476+aWZHY0yQH81uOYvH@users.noreply.github.com> Date: Thu, 12 Mar 2026 22:13:00 -0700 Subject: [PATCH] fix bandwidth function for DT systems --- control/lti.py | 8 +++++++- control/tests/lti_test.py | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/control/lti.py b/control/lti.py index e4c9b2f4e..90188f556 100644 --- a/control/lti.py +++ b/control/lti.py @@ -211,8 +211,14 @@ def bandwidth(self, dbdrop=-3): # solve for the bandwidth, use scipy.optimize.root_scalar() to # solve using bisection import scipy + + if self.isdtime(strict=True): + cvt_w = lambda w: np.exp(1j * w * self.dt) + else: + cvt_w = lambda w: 1j * w + result = scipy.optimize.root_scalar( - lambda w: np.abs(self(w*1j)) - np.abs(dcgain)*10**(dbdrop/20), + lambda w: np.abs(self(cvt_w(w))) - np.abs(dcgain)*10**(dbdrop/20), bracket=[omega[idx_dropped[0] - 1], omega[idx_dropped[0]]], method='bisect') diff --git a/control/tests/lti_test.py b/control/tests/lti_test.py index dd95f3505..3cbb8439c 100644 --- a/control/tests/lti_test.py +++ b/control/tests/lti_test.py @@ -109,6 +109,11 @@ def test_bandwidth(self): np.testing.assert_allclose(sys1.bandwidth(), 0.099762834511098) np.testing.assert_allclose(bandwidth(sys1), 0.099762834511098) + # test a first-order discrete-time system, compared with matlab + sysd1 = tf([0.1, 0], [1, -0.9], 1) + np.testing.assert_allclose(sysd1.bandwidth(), 0.105207775532932) + np.testing.assert_allclose(bandwidth(sysd1), 0.105207775532932) + # test a second-order system, compared with matlab wn2 = 1 zeta2 = 0.001