control.frequency_response

control.frequency_response(sysdata, omega=None, omega_limits=None, omega_num=None, Hz=None, squeeze=None)[source]

Frequency response of an LTI system.

For continuous-time systems with transfer function G, computes the frequency response as

G(j*omega) = mag * exp(j*phase)

For discrete-time systems, the response is evaluated around the unit circle such that

G(exp(j*omega*dt)) = mag * exp(j*phase).

In general the system may be multiple input, multiple output (MIMO), where m = self.ninputs number of inputs and p = self.noutputs number of outputs.

Parameters
sysdataLTI system or list of LTI systems

Linear system(s) for which frequency response is computed.

omegafloat or 1D array_like, optional

A list, tuple, array, or scalar value of frequencies in radians/sec at which the system will be evaluated. Can be a single frequency or array of frequencies, which will be sorted before evaluation. If None (default), a common set of frequencies that works across all given systems is computed.

omega_limitsarray_like of two values, optional

Limits to the range of frequencies, in rad/sec. Specifying omega as a list of two elements is equivalent to providing omega_limits. Ignored if omega is provided.

omega_numint, optional

Number of frequency samples at which to compute the response. Defaults to config.defaults['freqplot.number_of_samples']. Ignored if omega is provided.

Returns
responseFrequencyResponseData

Frequency response data object representing the frequency response. When accessed as a tuple, returns (magnitude, phase, omega). If sysdata is a list of systems, returns a FrequencyResponseList object. Results can be plotted using the plot method. See FrequencyResponseData for more detailed information.

response.magnitudearray

Magnitude of the frequency response (absolute value, not dB or log10). If the system is SISO and squeeze is not True, the array is 1D, indexed by frequency. If the system is not SISO or squeeze is False, the array is 3D, indexed by the output, input, and, if omega is array_like, frequency. If squeeze is True then single-dimensional axes are removed.

response.phasearray

Wrapped phase, in radians, with same shape as magnitude.

response.omegaarray

Sorted list of frequencies at which response was evaluated.

Other Parameters
Hzbool, optional

If True, when computing frequency limits automatically set limits to full decades in Hz instead of rad/s. Omega is always returned in rad/sec.

squeezebool, optional

If squeeze = True, remove single-dimensional entries from the shape of the output even if the system is not SISO. If squeeze = False, keep all indices (output, input and, if omega is array_like, frequency) even if the system is SISO. The default value can be set using config.defaults['control.squeeze_frequency_response'].

Notes

This function is a wrapper for StateSpace.frequency_response and TransferFunction.frequency_response. You can also use the lower-level methods sys(s) or sys(z) to generate the frequency response for a single system.

All frequency data should be given in rad/sec. If frequency limits are computed automatically, the Hz keyword can be used to ensure that limits are in factors of decades in Hz, so that Bode plots with Hz = True look better.

The frequency response data can be plotted by calling the bode_plot function or using the plot method of the FrequencyResponseData class.

Examples

>>> G = ct.ss([[-1, -2], [3, -4]], [[5], [7]], [[6, 8]], [[9]])
>>> mag, phase, omega = ct.frequency_response(G, [0.1, 1., 10.])
>>> sys = ct.rss(3, 2, 2)
>>> mag, phase, omega = ct.frequency_response(sys, [0.1, 1., 10.])
>>> mag[0, 1, :]    # Magnitude of second input to first output
array([..., ..., ...])
>>> phase[1, 0, :]  # Phase of first input to second output
array([..., ..., ...])