Skip to content

Commit 44274c3

Browse files
committed
update names and clean up zero input/state and single trace processing
1 parent 3bc9871 commit 44274c3

5 files changed

Lines changed: 215 additions & 115 deletions

File tree

control/iosys.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333

3434
from .statesp import StateSpace, tf2ss, _convert_to_statespace
3535
from .timeresp import _check_convert_array, _process_time_response, \
36-
InputOutputResponse
36+
TimeResponseData
3737
from .lti import isctime, isdtime, common_timebase
3838
from . import config
3939

@@ -1571,7 +1571,7 @@ def input_output_response(
15711571
for i in range(len(T)):
15721572
u = U[i] if len(U.shape) == 1 else U[:, i]
15731573
y[:, i] = sys._out(T[i], [], u)
1574-
return InputOutputResponse(
1574+
return TimeResponseData(
15751575
T, y, np.zeros((0, 0, np.asarray(T).size)), None, sys=sys,
15761576
transpose=transpose, return_x=return_x, squeeze=squeeze)
15771577

@@ -1667,7 +1667,7 @@ def ivp_rhs(t, x):
16671667
else: # Neither ctime or dtime??
16681668
raise TypeError("Can't determine system type")
16691669

1670-
return InputOutputResponse(
1670+
return TimeResponseData(
16711671
soln.t, y, soln.y, U, sys=sys,
16721672
transpose=transpose, return_x=return_x, squeeze=squeeze)
16731673

control/statesp.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1932,10 +1932,10 @@ def rss(states=1, outputs=1, inputs=1, strictly_proper=False):
19321932
----------
19331933
states : int
19341934
Number of state variables
1935-
inputs : int
1936-
Number of system inputs
19371935
outputs : int
19381936
Number of system outputs
1937+
inputs : int
1938+
Number of system inputs
19391939
strictly_proper : bool, optional
19401940
If set to 'True', returns a proper system (no direct term).
19411941

control/tests/timeresp_return_test.py

Lines changed: 0 additions & 42 deletions
This file was deleted.

control/tests/trdata_test.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
"""trdata_test.py - test return values from time response functions
2+
3+
RMM, 22 Aug 2021
4+
5+
This set of unit tests covers checks to make sure that the various time
6+
response functions are returning the right sets of objects in the (new)
7+
InputOutputResponse class.
8+
9+
"""
10+
11+
import pytest
12+
13+
import numpy as np
14+
import control as ct
15+
16+
17+
@pytest.mark.parametrize(
18+
"nout, nin, squeeze", [
19+
[1, 1, None],
20+
[1, 1, True],
21+
[1, 1, False],
22+
[1, 2, None],
23+
[1, 2, True],
24+
[1, 2, False],
25+
[2, 1, None],
26+
[2, 1, True],
27+
[2, 1, False],
28+
[2, 2, None],
29+
[2, 2, True],
30+
[2, 2, False],
31+
])
32+
def test_trdata_shapes(nin, nout, squeeze):
33+
# SISO, single trace
34+
sys = ct.rss(4, nout, nin, strictly_proper=True)
35+
T = np.linspace(0, 1, 10)
36+
U = np.outer(np.ones(nin), np.sin(T) )
37+
X0 = np.ones(sys.nstates)
38+
39+
#
40+
# Initial response
41+
#
42+
res = ct.initial_response(sys, X0=X0)
43+
ntimes = res.time.shape[0]
44+
45+
# Check shape of class members
46+
assert len(res.time.shape) == 1
47+
assert res.y.shape == (sys.noutputs, ntimes)
48+
assert res.x.shape == (sys.nstates, ntimes)
49+
assert res.u is None
50+
51+
# Check shape of class properties
52+
if sys.issiso():
53+
assert res.outputs.shape == (ntimes,)
54+
assert res.states.shape == (sys.nstates, ntimes)
55+
assert res.inputs is None
56+
elif res.squeeze is True:
57+
assert res.outputs.shape == (ntimes, )
58+
assert res.states.shape == (sys.nstates, ntimes)
59+
assert res.inputs is None
60+
else:
61+
assert res.outputs.shape == (sys.noutputs, ntimes)
62+
assert res.states.shape == (sys.nstates, ntimes)
63+
assert res.inputs is None
64+
65+
#
66+
# Impulse and step response
67+
#
68+
for fcn in (ct.impulse_response, ct.step_response):
69+
res = fcn(sys, squeeze=squeeze)
70+
ntimes = res.time.shape[0]
71+
72+
# Check shape of class members
73+
assert len(res.time.shape) == 1
74+
assert res.y.shape == (sys.noutputs, sys.ninputs, ntimes)
75+
assert res.x.shape == (sys.nstates, sys.ninputs, ntimes)
76+
assert res.u.shape == (sys.ninputs, sys.ninputs, ntimes)
77+
78+
# Check shape of inputs and outputs
79+
if sys.issiso() and squeeze is not False:
80+
assert res.outputs.shape == (ntimes, )
81+
assert res.inputs.shape == (ntimes, )
82+
elif res.squeeze is True:
83+
assert res.outputs.shape == \
84+
np.empty((sys.noutputs, sys.ninputs, ntimes)).squeeze().shape
85+
assert res.inputs.shape == \
86+
np.empty((sys.ninputs, sys.ninputs, ntimes)).squeeze().shape
87+
else:
88+
assert res.outputs.shape == (sys.noutputs, sys.ninputs, ntimes)
89+
assert res.inputs.shape == (sys.ninputs, sys.ninputs, ntimes)
90+
91+
# Check state space dimensions (not affected by squeeze)
92+
if sys.issiso():
93+
assert res.states.shape == (sys.nstates, ntimes)
94+
else:
95+
assert res.states.shape == (sys.nstates, sys.ninputs, ntimes)
96+
97+
#
98+
# Forced response
99+
#
100+
res = ct.forced_response(sys, T, U, X0, squeeze=squeeze)
101+
ntimes = res.time.shape[0]
102+
103+
assert len(res.time.shape) == 1
104+
assert res.y.shape == (sys.noutputs, ntimes)
105+
assert res.x.shape == (sys.nstates, ntimes)
106+
assert res.u.shape == (sys.ninputs, ntimes)
107+
108+
if sys.issiso() and squeeze is not False:
109+
assert res.outputs.shape == (ntimes,)
110+
assert res.inputs.shape == (ntimes,)
111+
elif squeeze is True:
112+
assert res.outputs.shape == \
113+
np.empty((sys.noutputs, 1, ntimes)).squeeze().shape
114+
assert res.inputs.shape == \
115+
np.empty((sys.ninputs, 1, ntimes)).squeeze().shape
116+
else: # MIMO or squeeze is False
117+
assert res.outputs.shape == (sys.noutputs, ntimes)
118+
assert res.inputs.shape == (sys.ninputs, ntimes)
119+
120+
# Check state space dimensions (not affected by squeeze)
121+
assert res.states.shape == (sys.nstates, ntimes)

0 commit comments

Comments
 (0)