Skip to content

Commit 48015d5

Browse files
committed
MAINT: _bode_defaults removed, fields moved in _freqplot_default
TST: tests in config_test modified to interpret omega in Hz if the option Hz is set to True
1 parent 34c3826 commit 48015d5

3 files changed

Lines changed: 46 additions & 42 deletions

File tree

control/config.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ def reset_defaults():
4343
# System level defaults
4444
defaults.update(_control_defaults)
4545

46-
from .freqplot import _bode_defaults, _freqplot_defaults, _nyquist_defaults
47-
defaults.update(_bode_defaults)
46+
from .freqplot import _freqplot_defaults, _nyquist_defaults
4847
defaults.update(_freqplot_defaults)
4948
defaults.update(_nyquist_defaults)
5049

@@ -133,7 +132,7 @@ def use_matlab_defaults():
133132
* State space class and functions use Numpy matrix objects
134133
135134
"""
136-
set_defaults('bode', dB=True, deg=True, Hz=False, grid=True)
135+
set_defaults('freqplot', dB=True, deg=True, Hz=False, grid=True)
137136
set_defaults('statesp', use_numpy_matrix=True)
138137

139138

@@ -147,7 +146,7 @@ def use_fbs_defaults():
147146
* Nyquist plots use dashed lines for mirror image of Nyquist curve
148147
149148
"""
150-
set_defaults('bode', dB=False, deg=True, Hz=False, grid=False)
149+
set_defaults('freqplot', dB=False, deg=True, Hz=False, grid=False)
151150
set_defaults('nyquist', mirror_style='--')
152151

153152

@@ -179,6 +178,7 @@ class and functions. If flat is `False`, then matrices are
179178
stacklevel=2, category=DeprecationWarning)
180179
set_defaults('statesp', use_numpy_matrix=flag)
181180

181+
182182
def use_legacy_defaults(version):
183183
""" Sets the defaults to whatever they were in a given release.
184184

control/freqplot.py

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,11 @@
6363
_freqplot_defaults = {
6464
'freqplot.feature_periphery_decades': 1,
6565
'freqplot.number_of_samples': 1000,
66+
'freqplot.dB': False, # Plot gain in dB
67+
'freqplot.deg': True, # Plot phase in degrees
68+
'freqplot.Hz': False, # Plot frequency in Hertz
69+
'freqplot.grid': True, # Turn on grid for gain and phase
70+
'freqplot.wrap_phase': False, # Wrap the phase plot at a given value
6671
}
6772

6873
#
@@ -76,15 +81,6 @@
7681
# Bode plot
7782
#
7883

79-
# Default values for Bode plot configuration variables
80-
_bode_defaults = {
81-
'bode.dB': False, # Plot gain in dB
82-
'bode.deg': True, # Plot phase in degrees
83-
'bode.Hz': False, # Plot frequency in Hertz
84-
'bode.grid': True, # Turn on grid for gain and phase
85-
'bode.wrap_phase': False, # Wrap the phase plot at a given value
86-
}
87-
8884

8985
def bode_plot(syslist, omega=None,
9086
plot=True, omega_limits=None, omega_num=None,
@@ -103,10 +99,10 @@ def bode_plot(syslist, omega=None,
10399
If True, plot result in dB. Default is false.
104100
Hz : bool
105101
If True, plot frequency in Hz (omega must be provided in rad/sec).
106-
Default value (False) set by config.defaults['bode.Hz']
102+
Default value (False) set by config.defaults['freqplot.Hz']
107103
deg : bool
108104
If True, plot phase in degrees (else radians). Default value (True)
109-
config.defaults['bode.deg']
105+
config.defaults['freqplot.deg']
110106
plot : bool
111107
If True (default), plot magnitude and phase
112108
omega_limits : array_like of two values
@@ -184,16 +180,21 @@ def bode_plot(syslist, omega=None,
184180
plot = kwargs.pop('Plot')
185181

186182
# Get values for params (and pop from list to allow keyword use in plot)
187-
dB = config._get_param('bode', 'dB', kwargs, _bode_defaults, pop=True)
188-
deg = config._get_param('bode', 'deg', kwargs, _bode_defaults, pop=True)
189-
Hz = config._get_param('bode', 'Hz', kwargs, _bode_defaults, pop=True)
190-
grid = config._get_param('bode', 'grid', kwargs, _bode_defaults, pop=True)
191-
plot = config._get_param('bode', 'plot', plot, True)
192-
margins = config._get_param('bode', 'margins', margins, False)
183+
dB = config._get_param(
184+
'freqplot', 'dB', kwargs, _freqplot_defaults, pop=True)
185+
deg = config._get_param(
186+
'freqplot', 'deg', kwargs, _freqplot_defaults, pop=True)
187+
Hz = config._get_param(
188+
'freqplot', 'Hz', kwargs, _freqplot_defaults, pop=True)
189+
grid = config._get_param(
190+
'freqplot', 'grid', kwargs, _freqplot_defaults, pop=True)
191+
plot = config._get_param('freqplot', 'plot', plot, True)
192+
margins = config._get_param(
193+
'freqplot', 'margins', margins, False)
193194
wrap_phase = config._get_param(
194-
'bode', 'wrap_phase', kwargs, _bode_defaults, pop=True)
195+
'freqplot', 'wrap_phase', kwargs, _freqplot_defaults, pop=True)
195196
initial_phase = config._get_param(
196-
'bode', 'initial_phase', kwargs, None, pop=True)
197+
'freqplot', 'initial_phase', kwargs, None, pop=True)
197198
omega_num = config._get_param('freqplot', 'number_of_samples', omega_num)
198199
# If argument was a singleton, turn it into a tuple
199200
if not hasattr(syslist, '__iter__'):
@@ -937,9 +938,12 @@ def gangof4_plot(P, C, omega=None, **kwargs):
937938
"Gang of four is currently only implemented for SISO systems.")
938939

939940
# Get the default parameter values
940-
dB = config._get_param('bode', 'dB', kwargs, _bode_defaults, pop=True)
941-
Hz = config._get_param('bode', 'Hz', kwargs, _bode_defaults, pop=True)
942-
grid = config._get_param('bode', 'grid', kwargs, _bode_defaults, pop=True)
941+
dB = config._get_param(
942+
'freqplot', 'dB', kwargs, _freqplot_defaults, pop=True)
943+
Hz = config._get_param(
944+
'freqplot', 'Hz', kwargs, _freqplot_defaults, pop=True)
945+
grid = config._get_param(
946+
'freqplot', 'grid', kwargs, _freqplot_defaults, pop=True)
943947

944948
# Compute the senstivity functions
945949
L = P * C
@@ -1094,11 +1098,11 @@ def singular_values_plot(syslist, omega=None,
10941098

10951099
# Get values for params (and pop from list to allow keyword use in plot)
10961100
dB = config._get_param(
1097-
'singular_values_plot', 'dB', kwargs, _singular_values_plot_default, pop=True)
1101+
'freqplot', 'dB', kwargs, _singular_values_plot_default, pop=True)
10981102
Hz = config._get_param(
1099-
'singular_values_plot', 'Hz', kwargs, _singular_values_plot_default, pop=True)
1103+
'freqplot', 'Hz', kwargs, _singular_values_plot_default, pop=True)
11001104
grid = config._get_param(
1101-
'singular_values_plot', 'grid', kwargs, _singular_values_plot_default, pop=True)
1105+
'freqplot', 'grid', kwargs, _singular_values_plot_default, pop=True)
11021106
plot = config._get_param(
11031107
'singular_values_plot', 'plot', plot, True)
11041108
omega_num = config._get_param('freqplot', 'number_of_samples', omega_num)
@@ -1262,7 +1266,7 @@ def _determine_omega_vector(syslist, omega_in, omega_limits, omega_num, Hz):
12621266
np.log10(omega_limits[1]),
12631267
num=omega_num, endpoint=True)
12641268
else:
1265-
omega_out = np.asarray(omega_in)
1269+
omega_out = np.copy(omega_in)
12661270
if Hz:
12671271
omega_out *= 2. * math.pi
12681272
return omega_out, omega_range_given

control/tests/config_test.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@ def test_set_defaults(self):
3030

3131
@mplcleanup
3232
def test_get_param(self):
33-
assert ct.config._get_param('bode', 'dB')\
34-
== ct.config.defaults['bode.dB']
35-
assert ct.config._get_param('bode', 'dB', 1) == 1
33+
assert ct.config._get_param('freqplot', 'dB')\
34+
== ct.config.defaults['freqplot.dB']
35+
assert ct.config._get_param('freqplot', 'dB', 1) == 1
3636
ct.config.defaults['config.test1'] = 1
3737
assert ct.config._get_param('config', 'test1', None) == 1
3838
assert ct.config._get_param('config', 'test1', None, 1) == 1
@@ -85,7 +85,7 @@ def test_fbs_bode(self):
8585
np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)
8686

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

@@ -130,7 +130,7 @@ def test_matlab_bode(self):
130130
np.testing.assert_almost_equal(mag_y[0], 20*log10(10), decimal=3)
131131

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

@@ -141,9 +141,9 @@ def test_matlab_bode(self):
141141

142142
@mplcleanup
143143
def test_custom_bode_default(self):
144-
ct.config.defaults['bode.dB'] = True
145-
ct.config.defaults['bode.deg'] = True
146-
ct.config.defaults['bode.Hz'] = True
144+
ct.config.defaults['freqplot.dB'] = True
145+
ct.config.defaults['freqplot.deg'] = True
146+
ct.config.defaults['freqplot.Hz'] = True
147147

148148
# Generate a Bode plot
149149
plt.figure()
@@ -154,7 +154,7 @@ def test_custom_bode_default(self):
154154

155155
# Override defaults
156156
plt.figure()
157-
ct.bode_plot(self.sys, omega, Hz=True, deg=False, dB=True)
157+
ct.bode_plot(self.sys, omega/2./pi, Hz=True, deg=False, dB=True)
158158
mag_x, mag_y = (((plt.gcf().axes[0]).get_lines())[0]).get_data()
159159
phase_x, phase_y = (((plt.gcf().axes[1]).get_lines())[0]).get_data()
160160
np.testing.assert_almost_equal(mag_x[0], 0.001 / (2*pi), decimal=6)
@@ -200,9 +200,9 @@ def test_bode_feature_periphery_decade(self):
200200
def test_reset_defaults(self):
201201
ct.use_matlab_defaults()
202202
ct.reset_defaults()
203-
assert not ct.config.defaults['bode.dB']
204-
assert ct.config.defaults['bode.deg']
205-
assert not ct.config.defaults['bode.Hz']
203+
assert not ct.config.defaults['freqplot.dB']
204+
assert ct.config.defaults['freqplot.deg']
205+
assert not ct.config.defaults['freqplot.Hz']
206206
assert ct.config.defaults['freqplot.number_of_samples'] == 1000
207207
assert ct.config.defaults['freqplot.feature_periphery_decades'] == 1.0
208208

0 commit comments

Comments
 (0)