@@ -191,7 +191,86 @@ Additional features
191191===================
192192
193193The I/O systems module has a number of other features that can be used to
194- simplify the creation of interconnected input/output systems.
194+ simplify the creation and use of interconnected input/output systems.
195+
196+ Vector elements processing
197+ --------------------------
198+
199+ Several I/O system commands perform processing of vector elements
200+ (such as initial states or input vectors) and broadcast these to the
201+ proper shape.
202+
203+ For static elements, such as the initial state in a simulation or the
204+ nominal state and input for a linearization), the following processing
205+ is done:
206+
207+ * Scalars are automatically converted to a vector of the appropriate
208+ size consisting of the scalar value. This is commonly used when
209+ specifying the origin ('0') or a step input ('1').
210+
211+ * Lists of values are concatenated into a single vector. This is
212+ often used when you have an interconnected system and you need to
213+ specify the initial condition or input value for each subsystem
214+ (e.g., [X1eq, X2eq, ...]).
215+
216+ * Vector elements are zero padded to the required length. If you
217+ specify only a portion of the values for states or inputs, the
218+ remaining values are taken as zero. (If the final element in the
219+ given vector is non-zero, a warning is issues.)
220+
221+ Similar processing is done for input time series, used for the
222+ :func: `~control.input_output_response ` and
223+ :func: `~control.forced_response ` commands, with the following
224+ additional feature:
225+
226+ * Time series elements are broadcast to match the number of time points
227+ specified. If a list of time series and static elements are given (as a
228+ list), static elements are broadcast to the proper number of time points,
229+ and the overall list of elements concatenated to provide the full input
230+ vector.
231+
232+ As an example, suppose we have an interconnected system consisting of three
233+ subsystems, a controlled process, an estimator, and a (static) controller::
234+
235+ proc = ct.nlsys(...,
236+ states=2, inputs=['u1', 'u2', 'd'], outputs='y')
237+ estim = ct.nlsys(...,
238+ states=2, inputs='y', outputs=['xhat[0]', 'xhat[1]')
239+ ctrl = ct.nlsys(...,
240+ states=0, inputs=['r', 'xhat[0]', 'xhat[1]'], outputs=['u1', 'u2'])
241+
242+ clsys = ct.interconnect(
243+ [proc, estim, ctrl], inputs=['r', 'd'], outputs=['y', 'u1', 'u2'])
244+
245+ To linearize the system around the origin, we can utilize the scalar
246+ processing feature of vector elements::
247+
248+ P = proc.linearize(0, 0)
249+
250+ In this command, the states and the inputs are broadcast to the size of the
251+ state and input vectors, respectively.
252+
253+ If we want to linearize the closed loop system around a process state
254+ ``x0 `` (with two elemenst) and an estimator state ``0 `` (for both states),
255+ we can use the list processing feature::
256+
257+ H = clsys.liniearize([x0, 0], 0)
258+
259+ Note that this also utilizes the zero-padding functionality, since the
260+ second argument in the list ``[x0, 0] `` is a scalar and so the vector
261+ ``[x0, 0] `` only has three elements instead of the required four.
262+
263+ To run an input/output simulation with a sinsoidal signal for the first
264+ input, a constant for the second input, and no external disturbance, we can
265+ use the list processing feature combined with time series broadcasting::
266+
267+ timepts = np.linspace(0, 10)
268+ u1 = np.sin(timepts)
269+ u2 = 1
270+ resp = ct.input_output_response(clsys, timepts, [u1, u2, 0])
271+
272+ In this command, the second and third arguments will be broadcast to match
273+ the number of time points.
195274
196275Summing junction
197276----------------
0 commit comments