-
Notifications
You must be signed in to change notification settings - Fork 450
Open
Description
Description
When computing impulse responses for discrete-time systems with negative real poles, ct.impulse_response() generates a RuntimeWarning: divide by zero encountered in divide. This occurs even though the system is valid and the results are correct.
Minimal Reproducible Example
import control as ct
import numpy as np
# Discrete-time system with poles at -1 and -2
b, a = [1, 3, 0], [1, 3, 2]
sys = ct.TransferFunction(b, a, dt=True)
# This triggers the warning
t, y = ct.impulse_response(sys, 5)Output:
RuntimeWarning: divide by zero encountered in divide
t_emp = np.max(log_decay_percent / np.abs((np.log(p_nr)/dt).real))
Root Cause
The warning originates from the settling time calculation in the time response functions. For negative real poles in discrete-time systems:
np.log(-1) = 0 + πj(real part is exactly 0)np.log(-2) = 0.693 + πj(real part is small)
The code attempts to compute settling time using:
t_emp = np.max(log_decay_percent / np.abs((np.log(p_nr)/dt).real))When the real part of log(p_nr) is zero or near-zero, this causes division by zero.
For discrete-time systems, stability and settling behavior should be based on pole magnitudes (|pole| < 1), not logarithms of negative numbers.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels