def test_damp(self): # Test the continuous time case. zeta = 0.1 wn = 42 p = -wn * zeta + 1j * wn * np.sqrt(1 - zeta**2) sys = tf(1, [1, 2 * zeta * wn, wn**2]) expected = ([wn, wn], [zeta, zeta], [p, p.conjugate()]) np.testing.assert_allclose(sys.damp(), expected) np.testing.assert_allclose(damp(sys), expected) # Also test the discrete time case. dt = 0.001 sys_dt = c2d(sys, dt, method='matched') p_zplane = np.exp(p * dt) expected_dt = ([wn, wn], [zeta, zeta], [p_zplane, p_zplane.conjugate()]) np.testing.assert_almost_equal(sys_dt.damp(), expected_dt) np.testing.assert_almost_equal(damp(sys_dt), expected_dt) #also check that for a discrete system with a negative real pole the damp function can extract wn and zeta. p2_zplane = -0.2 sys_dt2 = tf(1, [1, -p2_zplane], dt) wn2, zeta2, p2 = sys_dt2.damp() p2_splane = -wn2 * zeta2 + 1j * wn2 * np.sqrt(1 - zeta2**2) p2_zplane = np.exp(p2_splane * dt) np.testing.assert_almost_equal(p2, p2_zplane)
def test_damp(self): # Test the continuous time case. zeta = 0.1 wn = 42 p = -wn * zeta + 1j * wn * np.sqrt(1 - zeta**2) sys = tf(1, [1, 2 * zeta * wn, wn**2]) expected = ([wn, wn], [zeta, zeta], [p, p.conjugate()]) np.testing.assert_equal(sys.damp(), expected) np.testing.assert_equal(damp(sys), expected) # Also test the discrete time case. dt = 0.001 sys_dt = c2d(sys, dt, method='matched') p_zplane = np.exp(p*dt) expected_dt = ([wn, wn], [zeta, zeta], [p_zplane, p_zplane.conjugate()]) np.testing.assert_almost_equal(sys_dt.damp(), expected_dt) np.testing.assert_almost_equal(damp(sys_dt), expected_dt)