|
5 | 5 |
|
6 | 6 | import unittest |
7 | 7 | import numpy as np |
8 | | -from control.rlocus import root_locus |
| 8 | +from control.rlocus import root_locus, _RLClickDispatcher |
9 | 9 | from control.xferfcn import TransferFunction |
10 | 10 | from control.statesp import StateSpace |
11 | 11 | from control.bdalg import feedback |
| 12 | +import matplotlib.pyplot as plt |
| 13 | +from control.tests.margin_test import assert_array_almost_equal |
| 14 | + |
12 | 15 |
|
13 | 16 | class TestRootLocus(unittest.TestCase): |
14 | 17 | """These are tests for the feedback function in rlocus.py.""" |
@@ -42,6 +45,31 @@ def test_without_gains(self): |
42 | 45 | roots, kvect = root_locus(sys, Plot=False) |
43 | 46 | self.check_cl_poles(sys, roots, kvect) |
44 | 47 |
|
| 48 | + def testRootLocusZoom(self): |
| 49 | + """Check the zooming functionality of the Root locus plot""" |
| 50 | + system = TransferFunction([1000], [1, 25, 100, 0]) |
| 51 | + root_locus(system) |
| 52 | + fig = plt.gcf() |
| 53 | + ax_rlocus = fig.axes[0] |
| 54 | + |
| 55 | + event = type('test', (object,), {'xdata': 0.9957380594313321, 'ydata': 1.7825491928580846, 'inaxes': ax_rlocus.axes})() |
| 56 | + ax_rlocus.set_xlim((-4.420022219849855, 0.9957380594313321)) |
| 57 | + ax_rlocus.set_ylim((1.7825491928580846, 10.695295157148486)) |
| 58 | + plt.get_current_fig_manager().toolbar.mode = 'zoom rect' |
| 59 | + _RLClickDispatcher(event, system, fig, ax_rlocus, '-') |
| 60 | + |
| 61 | + zoom_x = ax_rlocus.lines[-2].get_data()[0][65:75] |
| 62 | + zoom_y = ax_rlocus.lines[-2].get_data()[1][65:75] |
| 63 | + zoom_y = [abs(y) for y in zoom_y] |
| 64 | + |
| 65 | + zoom_x_valid = [-2.23659192, -2.23659121, -2.23659103, -2.23659086, -2.23659068, -2.23659063, |
| 66 | + -2.23659059, -2.23659055, -2.2365905, -2.23658766] |
| 67 | + zoom_y_valid = [1.78253589, 1.78254318, 1.782545, 1.78254682, 1.78254864, 1.7825491, |
| 68 | + 1.78254955, 1.78255001, 1.78255046, 1.7825796] |
| 69 | + |
| 70 | + assert_array_almost_equal(zoom_x,zoom_x_valid) |
| 71 | + assert_array_almost_equal(zoom_y,zoom_y_valid) |
| 72 | + |
45 | 73 | def test_suite(): |
46 | 74 | return unittest.TestLoader().loadTestsFromTestCase(TestRootLocus) |
47 | 75 |
|
|
0 commit comments