Skip to content

Commit 98f13be

Browse files
committed
add single function to compute response times
1 parent 4bad487 commit 98f13be

File tree

1 file changed

+24
-58
lines changed

1 file changed

+24
-58
lines changed

control/timeresp.py

+24-58
Original file line numberDiff line numberDiff line change
@@ -512,20 +512,7 @@ def step_response(sys, T=None, X0=0., input=None, output=None,
512512
"""
513513
sys = _get_ss_simo(sys, input, output)
514514
if T is None:
515-
if isctime(sys):
516-
if sys.A.shape == (0, 0):
517-
# No dynamics; use the unit time interval
518-
T = np.linspace(0, 1, 100, endpoint=False)
519-
else:
520-
T = _default_response_times(sys.A, 100)
521-
else:
522-
# For discrete time, use integers
523-
if sys.A.shape == (0, 0):
524-
# No dynamics; use 100 time steps
525-
T = range(100)
526-
else:
527-
tvec = _default_response_times(sys.A, 100)
528-
T = range(int(np.ceil(max(tvec))))
515+
T = _get_response_times(sys, N=100)
529516
U = np.ones_like(T)
530517

531518
T, yout, xout = forced_response(sys, T, U, X0, transpose=transpose,
@@ -580,22 +567,7 @@ def step_info(sys, T=None, SettlingTimeThreshold=0.02,
580567
'''
581568
sys = _get_ss_simo(sys)
582569
if T is None:
583-
if isctime(sys):
584-
if sys.A.shape == (0, 0):
585-
# No dynamics; use the unit time interval
586-
T = np.linspace(0, 1, 100, endpoint=False)
587-
else:
588-
# Use 1000 time points for accuracy
589-
T = _default_response_times(sys.A, 1000)
590-
else:
591-
# For discrete time, use integers
592-
if sys.A.shape == (0, 0):
593-
# No dynamics; use 100 time steps
594-
T = range(100)
595-
else:
596-
# Use 1000 time points for accuracy
597-
tvec = _default_response_times(sys.A, 1000)
598-
T = range(int(np.ceil(max(tvec))))
570+
T = _get_response_times(sys, N=1000)
599571

600572
T, yout = step_response(sys, T)
601573

@@ -714,20 +686,8 @@ def initial_response(sys, T=None, X0=0., input=0, output=None,
714686
# Create time and input vectors; checking is done in forced_response(...)
715687
# The initial vector X0 is created in forced_response(...) if necessary
716688
if T is None:
717-
if isctime(sys):
718-
if sys.A.shape == (0, 0):
719-
# No dynamics; use the unit time interval
720-
T = np.linspace(0, 1, 100, endpoint=False)
721-
else:
722-
T = _default_response_times(sys.A, 100)
723-
else:
724-
# For discrete time, use integers
725-
if sys.A.shape == (0, 0):
726-
# No dynamics; use 100 time steps
727-
T = range(100)
728-
else:
729-
tvec = _default_response_times(sys.A, 100)
730-
T = range(int(np.ceil(max(tvec))))
689+
# TODO: default step size inconsistent with step/impulse_response()
690+
T = _get_response_times(sys, N=1000)
731691
U = np.zeros_like(T)
732692

733693
T, yout, _xout = forced_response(sys, T, U, X0, transpose=transpose,
@@ -826,20 +786,7 @@ def impulse_response(sys, T=None, X0=0., input=0, output=None,
826786

827787
# Compute T and U, no checks necessary, they will be checked in lsim
828788
if T is None:
829-
if isctime(sys):
830-
if sys.A.shape == (0, 0):
831-
# No dynamics; use the unit time interval
832-
T = np.linspace(0, 1, 100, endpoint=False)
833-
else:
834-
T = _default_response_times(sys.A, 100)
835-
else:
836-
# For discrete time, use integers
837-
if sys.A.shape == (0, 0):
838-
# No dynamics; use 100 time steps
839-
T = range(100)
840-
else:
841-
tvec = _default_response_times(sys.A, 100)
842-
T = range(int(np.ceil(max(tvec))))
789+
T = _get_response_times(sys, N=100)
843790
U = np.zeros_like(T)
844791

845792
# Compute new X0 that contains the impulse
@@ -860,3 +807,22 @@ def impulse_response(sys, T=None, X0=0., input=0, output=None,
860807
return T, yout, _xout
861808

862809
return T, yout
810+
811+
812+
# Utility function to get response times
813+
def _get_response_times(sys, N=100):
814+
if isctime(sys):
815+
if sys.A.shape == (0, 0):
816+
# No dynamics; use the unit time interval
817+
T = np.linspace(0, 1, N, endpoint=False)
818+
else:
819+
T = _default_response_times(sys.A, N)
820+
else:
821+
# For discrete time, use integers
822+
if sys.A.shape == (0, 0):
823+
# No dynamics; use N time steps
824+
T = range(N)
825+
else:
826+
tvec = _default_response_times(sys.A, N)
827+
T = range(int(np.ceil(max(tvec))))
828+
return T

0 commit comments

Comments
 (0)