Course materials · Control Engineering II

Frequency Response

English translation

Learning objectives

Understanding how amplitude and phase change at each frequency connects Bode plots to actual signals.

Execution conditions

Read magnitude and phase from python-control's ctl.frequency_response. Phase is returned in radians; convert it to degrees in the table.

If the module is missing, run %pip install control==0.10.2 in a Colab or Jupyter code cell.

Measuring gain and phase with sinusoids

Starting conditions

G(s)=1s2+0.5s+1G(s)=\frac1{s^2+0.5s+1}, u=sin⁡(ωt)u=\sin(\omega t), ω∈{.2,1,3}\omega\in\{.2,1,3\} rad/s. 0≤t≤2000\le t\le 200 s, Δt=.01\Delta t=.01 s.

Procedure

  1. Calculate the output using ctl.forced_response, and plot the input and output for only the final two periods.
  2. Fit the output to asin⁡(ωt)+bcos⁡(ωt)a\sin(\omega t)+b\cos(\omega t) by least squares to obtain gain a2+b2\sqrt{a^2+b^2} and phase atan2⁡(b,a)\operatorname{atan2}(b,a).
  3. Compare with the magnitude and phase from ctl.frequency_response. Phase is returned in radians. Convert both phase calculations to degrees in the table.

Results to retain

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=1/(s*s+.5*s+1)
omega=1.;t=np.arange(0,200,.01);u=np.sin(omega*t)
response=ctl.forced_response(G,t,u)
y=np.asarray(response.outputs).reshape(-1)
keep=t>=t[-1]-4*np.pi/omega
# TODO: Fit a,b over the keep interval and calculate gain and phase.

Record results and self-check

ω [rad/s]:

Measured gain:

Calculated gain:

Measured phase [deg]:

Calculated phase [deg]:

Points to check

Comparing damping and resonance

Starting conditions

Set the denominator to s2+as+1s^2+as+1 and compare a∈{.2,.5,1}a\in\{.2,.5,1\}. Use ω=logspace(-2,2,400).

Procedure

  1. Plot the gains and phases of the three models on the same frequency axis.
  2. Tabulate each model's maximum gain, its frequency, and DC gain.
  3. Choose one sinusoidal condition near the maximum gain and check it using the method from the first activity.

Results to retain

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
omega=np.logspace(-2,2,400)
for a in [.2,.5,1.]:
    response=ctl.frequency_response(1/(s*s+a*s+1),omega)
    print(a,np.max(response.magnitude))
# TODO: Complete the phase and resonant-frequency table.

Record results and self-check

a:

Maximum gain:

ω at maximum gain:

DC Gain:

Points to check

Checking frequency units in the time domain

Starting conditions

ω=1\omega=1 rad/s differs from f=1f=1 Hz. The second input is sin⁡(2πt)\sin(2\pi t).

Procedure

  1. First record the periods of both inputs, then calculate their responses for the same G.
  2. Record the phase difference both as a time delay and as an angle.
  3. Explain what you would misread on a Bode plot if you confused rad/s with Hz.

Results to retain

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
G=1/(s*s+.5*s+1)
for w in [1.,2*np.pi]:
 print(w,'period',2*np.pi/w)
# TODO: Compare the responses to the two inputs.

Record results and self-check

Input:

ω [rad/s]:

Period [s]:

Gain:

Phase [deg]:

Points to check