GeezerVison is showing github.com — Result of the damp function for discrete time systems · Issue #646 · python-control/python-control
Result of the damp function for discrete time systems #646DescriptionHi,
This is my first contribution on GitHub ;)
Problem
The method damp() seems to return a wrong result for discrete systems with negative poles
import control as ctl
H = ctl.tf([1],[1,0.2],1)
H.damp()
Result : RuntimeWarning: invalid value encountered in log
Investigation
The problem seems to come from the type of the poles variable in the dampmethod of the LTI object
if isdtime(self, strict=True):
splane_poles = np.log(poles)/self.dt
else:
splane_poles = poles
wn = absolute(splane_poles)
Z = -real(splane_poles)/wn
return wn, Z, poles
Solution
The poles variable must be cast to a numpy complex type as follows
if isdtime(self, strict=True)
splane_poles = np.log(poles.astype(complex))/self.dt
...
Activitybnavigator commented on Aug 17, 2021 Hi,
thanks for catching this!
This is my first contribution on GitHub ;)
Awesome! Would you try to make the next step and create a Pull Request with your proposed changes?
Bonus points for adding your example to test_damp() (using pytest.mark.parametrize()) :
|
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) |
MetadataMetadataDevelopmentNo branches or pull requestsIssue actions
|