コード例 #1
0
 def test_reset_defaults(self):
     ct.use_matlab_defaults()
     ct.reset_defaults()
     assert not ct.config.defaults['bode.dB']
     assert ct.config.defaults['bode.deg']
     assert not ct.config.defaults['bode.Hz']
     assert ct.config.defaults['freqplot.number_of_samples'] is None
     assert ct.config.defaults['freqplot.feature_periphery_decades'] == 1.0
コード例 #2
0
 def test_reset_defaults(self):
     ct.use_matlab_defaults()
     ct.reset_defaults()
     self.assertEquals(ct.config.bode_dB, False)
     self.assertEquals(ct.config.bode_deg, True)
     self.assertEquals(ct.config.bode_Hz, False)
     self.assertEquals(ct.config.bode_number_of_samples, None)
     self.assertEquals(ct.config.bode_feature_periphery_decade, 1.0)
コード例 #3
0
 def test_reset_defaults(self):
     ct.use_matlab_defaults()
     ct.reset_defaults()
     self.assertEqual(ct.config.defaults['bode.dB'], False)
     self.assertEqual(ct.config.defaults['bode.deg'], True)
     self.assertEqual(ct.config.defaults['bode.Hz'], False)
     self.assertEqual(ct.config.defaults['freqplot.number_of_samples'],
                      None)
     self.assertEqual(
         ct.config.defaults['freqplot.feature_periphery_decades'], 1.0)
コード例 #4
0
 def test_legacy_defaults(self):
     ct.use_legacy_defaults('0.8.3')
     assert(isinstance(ct.ss(0,0,0,1).D, np.matrix))
     ct.reset_defaults()
     assert(isinstance(ct.ss(0,0,0,1).D, np.ndarray))
     # test that old versions don't raise a problem
     ct.use_legacy_defaults('0.6c')
     ct.use_legacy_defaults('0.8.2')
     ct.use_legacy_defaults('0.1')
     ct.config.reset_defaults()
コード例 #5
0
def control_defaults():
    """Make sure the testing session always starts with the defaults.

    This should be the first fixture initialized,
    so that all other fixtures see the general defaults (unless they set them
    themselves) even before importing control/__init__. Enforce this by adding
    it as an argument to all other session scoped fixtures.
    """
    control.reset_defaults()
    the_defaults = control.config.defaults.copy()
    yield
    # assert that nothing changed it without reverting
    assert control.config.defaults == the_defaults
コード例 #6
0
    def test_bode_number_of_samples(self):
        # Set the number of samples (default is 50, from np.logspace)
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, omega_num=87)
        self.assertEqual(len(mag_ret), 87)

        # Change the default number of samples
        ct.config.defaults['freqplot.number_of_samples'] = 76
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys)
        self.assertEqual(len(mag_ret), 76)

        # Override the default number of samples
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, omega_num=87)
        self.assertEqual(len(mag_ret), 87)

        ct.reset_defaults()
コード例 #7
0
    def test_bode_number_of_samples(self):
        # Set the number of samples (default is 50, from np.logspace)
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, omega_num=87)
        self.assertEqual(len(mag_ret), 87)

        # Change the default number of samples
        ct.config.bode_number_of_samples = 76
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys)
        self.assertEqual(len(mag_ret), 76)
        
        # Override the default number of samples
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, omega_num=87)
        self.assertEqual(len(mag_ret), 87)

        ct.reset_defaults()
コード例 #8
0
    def test_matlab_bode(self):
        ct.use_matlab_defaults()

        # Generate a Bode plot
        plt.figure()
        omega = np.logspace(-3, 3, 100)
        ct.bode_plot(self.sys, omega)

        # Get the magnitude line
        mag_axis = plt.gcf().axes[0]
        mag_line = mag_axis.get_lines()
        mag_data = mag_line[0].get_data()
        mag_x, mag_y = mag_data

        # Make sure the x-axis is in rad/sec and y-axis is in dB
        np.testing.assert_almost_equal(mag_x[0], 0.001, decimal=6)
        np.testing.assert_almost_equal(mag_y[0], 20 * log10(10), decimal=3)

        # Get the phase line
        phase_axis = plt.gcf().axes[1]
        phase_line = phase_axis.get_lines()
        phase_data = phase_line[0].get_data()
        phase_x, phase_y = phase_data

        # Make sure the x-axis is in rad/sec and y-axis is in degrees
        np.testing.assert_almost_equal(phase_x[-1], 1000, decimal=1)
        np.testing.assert_almost_equal(phase_y[-1], -180, decimal=0)

        # Override the defaults and make sure that works as well
        plt.figure()
        ct.bode_plot(self.sys, omega, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_y[0], 20 * log10(10), decimal=3)

        plt.figure()
        ct.bode_plot(self.sys, omega, Hz=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_x[0], 0.001 / (2 * pi), decimal=6)

        plt.figure()
        ct.bode_plot(self.sys, omega, deg=False)
        phase_x, phase_y = (((plt.gcf().axes[1]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(phase_y[-1], -pi, decimal=2)

        ct.reset_defaults()
コード例 #9
0
    def test_matlab_bode(self):
        ct.use_matlab_defaults();

        # Generate a Bode plot
        plt.figure()
        omega = np.logspace(-3, 3, 100)
        ct.bode_plot(self.sys, omega)

        # Get the magnitude line
        mag_axis = plt.gcf().axes[0]
        mag_line = mag_axis.get_lines()
        mag_data = mag_line[0].get_data()
        mag_x, mag_y = mag_data

        # Make sure the x-axis is in Hertz and y-axis is in dB
        np.testing.assert_almost_equal(mag_x[0], 0.001 / (2*pi), decimal=6)
        np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)

        # Get the phase line
        phase_axis = plt.gcf().axes[1]
        phase_line = phase_axis.get_lines()
        phase_data = phase_line[0].get_data()
        phase_x, phase_y = phase_data

        # Make sure the x-axis is in Hertz and y-axis is in degrees
        np.testing.assert_almost_equal(phase_x[-1], 1000 / (2*pi), decimal=1)
        np.testing.assert_almost_equal(phase_y[-1], -180, decimal=0)
        
        # Override the defaults and make sure that works as well
        plt.figure()
        ct.bode_plot(self.sys, omega, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)

        plt.figure()
        ct.bode_plot(self.sys, omega, Hz=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_x[0], 0.001 / (2*pi), decimal=6)

        plt.figure()
        ct.bode_plot(self.sys, omega, deg=False)
        phase_x, phase_y = (((plt.gcf().axes[1]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(phase_y[-1], -pi, decimal=2)

        ct.reset_defaults()
コード例 #10
0
    def test_bode_feature_periphery_decade(self):
        # Generate a sample Bode plot to figure out the range it uses
        ct.reset_defaults()  # Make sure starting state is correct
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=False)
        omega_min, omega_max = omega_ret[[0, -1]]

        # Reset the periphery decade value (should add one decade on each end)
        ct.config.defaults['freqplot.feature_periphery_decades'] = 2
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=False)
        np.testing.assert_almost_equal(omega_ret[0], omega_min / 10)
        np.testing.assert_almost_equal(omega_ret[-1], omega_max * 10)

        # Make sure it also works in rad/sec, in opposite direction
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=True)
        omega_min, omega_max = omega_ret[[0, -1]]
        ct.config.defaults['freqplot.feature_periphery_decades'] = 1
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=True)
        np.testing.assert_almost_equal(omega_ret[0], omega_min * 10)
        np.testing.assert_almost_equal(omega_ret[-1], omega_max / 10)
コード例 #11
0
    def test_bode_feature_periphery_decade(self):
        # Generate a sample Bode plot to figure out the range it uses
        ct.reset_defaults()     # Make sure starting state is correct
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=False)
        omega_min, omega_max = omega_ret[[0,  -1]]

        # Reset the periphery decade value (should add one decade on each end)
        ct.config.bode_feature_periphery_decade = 2
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=False)
        np.testing.assert_almost_equal(omega_ret[0], omega_min/10)
        np.testing.assert_almost_equal(omega_ret[-1], omega_max * 10)

        # Make sure it also works in rad/sec, in opposite direction
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=True)
        omega_min, omega_max = omega_ret[[0,  -1]]
        ct.config.bode_feature_periphery_decade = 1
        mag_ret, phase_ret, omega_ret = ct.bode_plot(self.sys, Hz=True)
        np.testing.assert_almost_equal(omega_ret[0], omega_min*10)
        np.testing.assert_almost_equal(omega_ret[-1], omega_max/10)

        ct.reset_defaults()
コード例 #12
0
    def test_custom_bode_default(self):
        ct.config.defaults['bode.dB'] = True
        ct.config.defaults['bode.deg'] = True
        ct.config.defaults['bode.Hz'] = True

        # Generate a Bode plot
        plt.figure()
        omega = np.logspace(-3, 3, 100)
        ct.bode_plot(self.sys, omega, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_y[0], 20 * log10(10), decimal=3)

        # Override defaults
        plt.figure()
        ct.bode_plot(self.sys, omega, Hz=True, deg=False, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        phase_x, phase_y = (((plt.gcf().axes[1]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_x[0], 0.001 / (2 * pi), decimal=6)
        np.testing.assert_almost_equal(mag_y[0], 20 * log10(10), decimal=3)
        np.testing.assert_almost_equal(phase_y[-1], -pi, decimal=2)

        ct.reset_defaults()
コード例 #13
0
    def test_custom_bode_default(self):
        ct.bode_dB = True
        ct.bode_deg = True
        ct.bode_Hz = True

        # Generate a Bode plot
        plt.figure()
        omega = np.logspace(-3, 3, 100)
        ct.bode_plot(self.sys, omega, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)

        # Override defaults
        plt.figure()
        ct.bode_plot(self.sys, omega, Hz=True, deg=False, dB=True)
        mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
        phase_x, phase_y = (((plt.gcf().axes[1]).get_lines())[0]).get_data()
        np.testing.assert_almost_equal(mag_x[0], 0.001 / (2*pi), decimal=6)
        np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)
        np.testing.assert_almost_equal(phase_y[-1], -pi, decimal=2)

        ct.reset_defaults()
コード例 #14
0
    def test_legacy_defaults(self):
        with pytest.deprecated_call():
            ct.use_legacy_defaults('0.8.3')
            assert(isinstance(ct.ss(0, 0, 0, 1).D, np.matrix))
        ct.reset_defaults()
        assert(isinstance(ct.ss(0, 0, 0, 1).D, np.ndarray))
        assert(not isinstance(ct.ss(0, 0, 0, 1).D, np.matrix))

        ct.use_legacy_defaults('0.9.0')
        assert(isinstance(ct.ss(0, 0, 0, 1).D, np.ndarray))
        assert(not isinstance(ct.ss(0, 0, 0, 1).D, np.matrix))

        # test that old versions don't raise a problem
        ct.use_legacy_defaults('REL-0.1')
        ct.use_legacy_defaults('control-0.3a')
        ct.use_legacy_defaults('0.6c')
        ct.use_legacy_defaults('0.8.2')
        ct.use_legacy_defaults('0.1')

        # Make sure that nonsense versions generate an error
        with pytest.raises(ValueError):
            ct.use_legacy_defaults("a.b.c")
        with pytest.raises(ValueError):
            ct.use_legacy_defaults("1.x.3")
コード例 #15
0
 def test_legacy_defaults(self):
     ct.use_legacy_defaults('0.8.3')
     assert (isinstance(ct.ss(0, 0, 0, 1).D, np.matrix))
     ct.reset_defaults()
     assert (isinstance(ct.ss(0, 0, 0, 1).D, np.ndarray))
コード例 #16
0
 def tearDown(self):
     ct.reset_defaults()