Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add unit test to make sure implicit tf -> ss conversion keeps name
  • Loading branch information
murrayrm committed Jun 4, 2023
commit e25ad673888e026da6c6e6dfcd0f99765b2d5d27
67 changes: 49 additions & 18 deletions control/tests/interconnect_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,23 +246,54 @@ def test_string_inputoutput():
assert P_s2.output_index == {'y2' : 0}

def test_linear_interconnect():
tf_ctrl = ct.tf(1, (10.1, 1), inputs='e', outputs='u')
tf_plant = ct.tf(1, (10.1, 1), inputs='u', outputs='y')
ss_ctrl = ct.ss(1, 2, 1, 2, inputs='e', outputs='u')
ss_plant = ct.ss(1, 2, 1, 2, inputs='u', outputs='y')
tf_ctrl = ct.tf(1, (10.1, 1), inputs='e', outputs='u', name='ctrl')
tf_plant = ct.tf(1, (10.1, 1), inputs='u', outputs='y', name='plant')
ss_ctrl = ct.ss(1, 2, 1, 0, inputs='e', outputs='u', name='ctrl')
ss_plant = ct.ss(1, 2, 1, 0, inputs='u', outputs='y', name='plant')
nl_ctrl = ct.NonlinearIOSystem(
lambda t, x, u, params: x*x,
lambda t, x, u, params: u*x, states=1, inputs='e', outputs='u')
lambda t, x, u, params: x*x, lambda t, x, u, params: u*x,
states=1, inputs='e', outputs='u', name='ctrl')
nl_plant = ct.NonlinearIOSystem(
lambda t, x, u, params: x*x,
lambda t, x, u, params: u*x, states=1, inputs='u', outputs='y')

assert isinstance(ct.interconnect((tf_ctrl, tf_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert isinstance(ct.interconnect((ss_ctrl, ss_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert isinstance(ct.interconnect((tf_ctrl, ss_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert isinstance(ct.interconnect((ss_ctrl, tf_plant), inputs='e', outputs='y'), ct.LinearIOSystem)

assert ~isinstance(ct.interconnect((nl_ctrl, ss_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert ~isinstance(ct.interconnect((nl_ctrl, tf_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert ~isinstance(ct.interconnect((ss_ctrl, nl_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
assert ~isinstance(ct.interconnect((tf_ctrl, nl_plant), inputs='e', outputs='y'), ct.LinearIOSystem)
lambda t, x, u, params: x*x, lambda t, x, u, params: u*x,
states=1, inputs='u', outputs='y', name='plant')
sumblk = ct.summing_junction(inputs=['r', '-y'], outputs=['e'], name='sum')

# Interconnections of linear I/O systems should be linear I/O system
assert isinstance(
ct.interconnect([tf_ctrl, tf_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert isinstance(
ct.interconnect([ss_ctrl, ss_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert isinstance(
ct.interconnect([tf_ctrl, ss_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert isinstance(
ct.interconnect([ss_ctrl, tf_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)

# Interconnections with nonliner I/O systems should not be linear
assert ~isinstance(
ct.interconnect([nl_ctrl, ss_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert ~isinstance(
ct.interconnect([nl_ctrl, tf_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert ~isinstance(
ct.interconnect([ss_ctrl, nl_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)
assert ~isinstance(
ct.interconnect([tf_ctrl, nl_plant, sumblk], inputs='r', outputs='y'),
ct.LinearIOSystem)

# Implicit converstion of transfer function should retain name
clsys = ct.interconnect(
[tf_ctrl, ss_plant, sumblk],
connections=[
['plant.u', 'ctrl.u'],
['ctrl.e', 'sum.e'],
['sum.y', 'plant.y']
],
inplist=['sum.r'], inputs='r',
outlist=['plant.y'], outputs='y')
assert clsys.syslist[0].name == 'ctrl'