Skip to content

Commit 77bc5c5

Browse files
committed
fixed that full 2x2 system wasn't being passed around correctly, giving wrong step response
1 parent 76b0507 commit 77bc5c5

2 files changed

Lines changed: 15 additions & 13 deletions

File tree

control/rlocus.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,10 @@ def root_locus(sys, kvect=None, xlim=None, ylim=None,
137137
print_gain = config._get_param(
138138
'rlocus', 'print_gain', print_gain, _rlocus_defaults)
139139

140+
sys_loop = sys if sys.issiso() else sys[0,0]
141+
140142
# Convert numerator and denominator to polynomials if they aren't
141-
(nump, denp) = _systopoly1d(sys)
143+
(nump, denp) = _systopoly1d(sys_loop)
142144

143145
# if discrete-time system and if xlim and ylim are not given,
144146
# that we a view of the unit circle
@@ -540,8 +542,9 @@ def _RLSortRoots(mymat):
540542

541543
def _RLZoomDispatcher(event, sys, ax_rlocus, plotstr):
542544
"""Rootlocus plot zoom dispatcher"""
545+
sys_loop = sys if sys.issiso() else sys[0,0]
543546

544-
nump, denp = _systopoly1d(sys)
547+
nump, denp = _systopoly1d(sys_loop)
545548
xlim, ylim = ax_rlocus.get_xlim(), ax_rlocus.get_ylim()
546549

547550
kvect, mymat, xlim, ylim = _default_gains(
@@ -573,7 +576,9 @@ def _RLClickDispatcher(event, sys, fig, ax_rlocus, plotstr, sisotool=False,
573576

574577
def _RLFeedbackClicksPoint(event, sys, fig, ax_rlocus, sisotool=False):
575578
"""Display root-locus gain feedback point for clicks on root-locus plot"""
576-
(nump, denp) = _systopoly1d(sys)
579+
sys_loop = sys if sys.issiso() else sys[0,0]
580+
581+
(nump, denp) = _systopoly1d(sys_loop)
577582

578583
xlim = ax_rlocus.get_xlim()
579584
ylim = ax_rlocus.get_ylim()
@@ -584,10 +589,10 @@ def _RLFeedbackClicksPoint(event, sys, fig, ax_rlocus, sisotool=False):
584589
# Catch type error when event click is in the figure but not in an axis
585590
try:
586591
s = complex(event.xdata, event.ydata)
587-
K = -1. / sys(s)
588-
K_xlim = -1. / sys(
592+
K = -1. / sys_loop(s)
593+
K_xlim = -1. / sys_loop(
589594
complex(event.xdata + 0.05 * abs(xlim[1] - xlim[0]), event.ydata))
590-
K_ylim = -1. / sys(
595+
K_ylim = -1. / sys_loop(
591596
complex(event.xdata, event.ydata + 0.05 * abs(ylim[1] - ylim[0])))
592597

593598
except TypeError:

control/sisotool.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,10 @@ def sisotool(sys, kvect = None, xlim_rlocus = None, ylim_rlocus = None,
6868
from .rlocus import root_locus
6969

7070
# sys as loop transfer function if SISO
71-
if sys.issiso():
72-
sys_loop = sys
73-
else:
71+
if not sys.issiso():
7472
if not sys.ninputs == 2 and sys.noutputs == 2:
7573
raise ControlMIMONotImplemented(
7674
'sys must be SISO or 2-input, 2-output')
77-
sys_loop = sys[0,0]
7875

7976
# Setup sisotool figure or superimpose if one is already present
8077
fig = plt.gcf()
@@ -101,7 +98,7 @@ def sisotool(sys, kvect = None, xlim_rlocus = None, ylim_rlocus = None,
10198
1 if kvect is None else kvect[0], bode_plot_params)
10299

103100
# Setup the root-locus plot window
104-
root_locus(sys_loop, kvect=kvect, xlim=xlim_rlocus,
101+
root_locus(sys, kvect=kvect, xlim=xlim_rlocus,
105102
ylim=ylim_rlocus, plotstr=plotstr_rlocus, grid=rlocus_grid,
106103
fig=fig, bode_plot_params=bode_plot_params, tvect=tvect, sisotool=True)
107104

@@ -159,10 +156,10 @@ def _SisotoolUpdate(sys, fig, K, bode_plot_params, tvect=None):
159156
if sys.issiso():
160157
sys_closed = (K*sys).feedback(1)
161158
else:
162-
sys_closed = append(sys, K)
159+
sys_closed = append(sys, -K)
163160
connects = [[1, 3],
164161
[3, 1]]
165-
sys_closed = connect(sys_closed, connects, (2,), (2,))
162+
sys_closed = connect(sys_closed, connects, 2, 2)
166163
if tvect is None:
167164
tvect, yout = step_response(sys_closed, T_num=100)
168165
else:

0 commit comments

Comments
 (0)