Part of the motivation for this question is that it is difficult to understand how an external input is being used if you can only specify it in terms of the subsystem that it connects to. It might be intended for the input to connect to multiple subsystems.
import numpy as np
import control as ct
def dynamics(t, x, u, p):
A = np.array([[0, 1], [-p['spring_constant'], -p['damping_coefficient']]])
B = np.array([[0], [1]])
return A @ x + B @ u
def outputs(t, x, u, p):
C = np.array([[1, 0]])
D = np.array([[0]])
return C @ x + D @ u
sys1 = ct.nlsys(updfcn=dynamics, outfcn=outputs, states=['pos', 'vel'], inputs=['u1'], outputs=['pos'], name='sys1')
sys1.params = {'spring_constant': 10, 'damping_coefficient': 0.5}
sys2 = ct.nlsys(updfcn=dynamics, outfcn=outputs, states=['pos', 'vel'], inputs=['u2'], outputs=['pos'], name='sys2')
sys2.params = {'spring_constant': 1, 'damping_coefficient': 1}
sys = ct.interconnect(
(sys1, sys2),
# inplist=['u'], # only works if both subsystem inputs are named u
outlist=['sys1.pos', 'sys2.pos'],
outputs=['pos1', 'pos2']
)
# /venv/lib/python3.12/site-packages/control/nlsys.py:1192: UserWarning: Unused input(s) in InterconnectedSystem: (1, 0)=sys2.u2; (0, 0)=sys1.u1
sys.set_input_map(np.array([[1],[1]]))
sys.set_inputs('external_input')
t = np.linspace(0, 10, 1000)
u0 = lambda t: 1
U = np.array([
[u0(ti) for ti in t]
])
results = ct.input_output_response(sys, T=t, U=U)
p = results.plot()
p.figure.show()
```</div>
Discussed in #1047
Originally posted by corbinklett October 9, 2024
If I have an input that is external to an interconnected system, and I want this external input to connect into multiple systems contained within, the only way I can think to do this is by using
set_input_map. Is there a more elegant way? Even when I useset_input_map, I still get the "unused input" warning.Part of the motivation for this question is that it is difficult to understand how an external input is being used if you can only specify it in terms of the subsystem that it connects to. It might be intended for the input to connect to multiple subsystems.
Here is an example of how I have implemented: