Chapter 14: Bode Plot Construction and Interpretation

Lesson 3: Bode Plots for Zeros, Complex Poles, and Time Delay

This lesson develops frequency-domain representations for transfer functions containing real and complex zeros, complex poles, and pure time delay. We exploit the logarithmic additivity of Bode plots to derive analytical magnitude and phase expressions, construct accurate asymptotic approximations, and study their impact on stability margins and performance. The lesson concludes with multi-language implementations (Python, C++, Java, MATLAB/Simulink, Wolfram Mathematica) suitable for robotic motion-control applications.

1. Decomposition into Bode-Relevant Factors

For an LTI single-input single-output system with transfer function \( G(s) \), Bode plots exploit the fact that magnitude in decibels and phase are additive over multiplication of factors. A general continuous-time transfer function (no repeated roots for simplicity) with real zeros, complex conjugate zeros, real poles, complex conjugate poles, and a pure time delay \( T > 0 \) can be written as

\[ G(s) = K \frac{ \displaystyle \prod_{i=1}^{n_z} \left(1 + \frac{s}{z_i}\right) \prod_{k=1}^{n_{cz}} \left(1 + 2\zeta_{z,k}\frac{s}{\omega_{z,k}} + \left(\frac{s}{\omega_{z,k}}\right)^2\right) e^{-sT} }{ \displaystyle \prod_{j=1}^{n_p} \left(1 + \frac{s}{p_j}\right) \prod_{\ell=1}^{n_{cp}} \left(1 + 2\zeta_{p,\ell}\frac{s}{\omega_{p,\ell}} + \left(\frac{s}{\omega_{p,\ell}}\right)^2\right) } , \]

where all real poles and zeros are assumed negative: \( z_i > 0,\, p_j > 0 \), and \( \zeta_{p,\ell}, \zeta_{z,k} \in (0,1) \) are damping ratios for complex conjugate pairs.

Evaluated on the imaginary axis \( s = j\omega \), the frequency response is \( G(j\omega) \). The Bode magnitude (in decibels) and phase (in degrees) are

\[ \begin{aligned} M(\omega) &:= 20 \log_{10} |G(j\omega)|, \\ \phi(\omega) &:= \arg G(j\omega) \cdot \frac{180}{\pi}. \end{aligned} \]

Because multiplication in the complex plane corresponds to addition of logarithms and phases, we can write

\[ \begin{aligned} M(\omega) &= 20\log_{10} |K| + \sum_i M_{z_i}(\omega) + \sum_k M_{cz,k}(\omega) - \sum_j M_{p_j}(\omega) - \sum_\ell M_{cp,\ell}(\omega) + M_{\text{delay}}(\omega), \\ \phi(\omega) &= \phi_K + \sum_i \phi_{z_i}(\omega) + \sum_k \phi_{cz,k}(\omega) - \sum_j \phi_{p_j}(\omega) - \sum_\ell \phi_{cp,\ell}(\omega) + \phi_{\text{delay}}(\omega), \end{aligned} \]

where each term is the contribution of a single factor. This principle underpins Bode construction: we study the elementary factors one by one.

flowchart TD
  G["G(s) = K * factors"] --> F1["Real zeros \n(1 + s/z_i)"]
  G --> F2["Real poles \n(1 + s/p_j)^(-1)"]
  G --> F3["Complex zeros & \npoles (2nd order)"]
  G --> F4["Pure delay exp(-s T)"]
  F1 --> B1["Magnitude and phase contributions"]
  F2 --> B1
  F3 --> B1
  F4 --> B1
  B1 --> SUM["Sum all contributions"]
  SUM --> BODE["Final Bode magnitude (dB) and phase (deg)"]
        

2. Real Zeros: Exact and Asymptotic Behavior

Consider a real zero at \( s=-z \) with \( z > 0 \):

\[ G_z(s) = 1 + \frac{s}{z}, \quad G_z(j\omega) = 1 + j\frac{\omega}{z}. \]

The magnitude and phase are

\[ |G_z(j\omega)| = \sqrt{1 + \left(\frac{\omega}{z}\right)^2}, \quad \phi_z(\omega) = \arctan\left(\frac{\omega}{z}\right) \cdot \frac{180}{\pi}. \]

The magnitude in decibels is

\[ M_z(\omega) = 10 \log_{10}\left(1 + \left(\frac{\omega}{z}\right)^2\right). \]

Two asymptotic regimes are fundamental:

  • For \( \omega \ll z \):

    \[ |G_z(j\omega)| \approx 1, \quad M_z(\omega) \approx 0 \text{ dB}, \quad \phi_z(\omega) \approx 0^{\circ}. \]

  • For \( \omega \gg z \):

    \[ |G_z(j\omega)| \approx \frac{\omega}{z} \Rightarrow M_z(\omega) \approx 20\log_{10}\left(\frac{\omega}{z}\right),\quad \frac{dM_z}{d(\log_{10}\omega)} \approx 20 \text{ dB/dec}. \]

Thus, the asymptotic Bode magnitude of a real zero is a line with 0 dB/dec slope for \( \omega < z \) and +20 dB/dec for \( \omega > z \), with a corner (break) frequency at \( \omega = z \).

The phase has a smooth transition from \(0^{\circ}\) to \(90^{\circ}\). A common first-order Bode approximation is

\[ \phi_z(\omega) \approx \begin{cases} 0^{\circ}, & \omega \le 0.1 z, \\ 45^{\circ} \left[1 + \log_{10}\left(\frac{\omega}{z}\right)\right], & 0.1 z < \omega < 10 z, \\ 90^{\circ}, & \omega \ge 10 z. \end{cases} \]

Real poles are handled analogously with opposite sign. For \( G_p(s) = (1 + s/p)^{-1} \), the magnitude slope changes by -20 dB/dec at \( \omega = p \), and the phase transitions from \(0^{\circ}\) to \(-90^{\circ}\).

3. Complex Conjugate Poles and Zeros

A standard second-order factor with natural frequency \( \omega_n > 0 \) and damping ratio \( \zeta \in (0,1) \) can appear either in the denominator (complex poles) or the numerator (complex zeros).

Complex pole pair. The normalized transfer function is

\[ G_{cp}(s) = \frac{1}{1 + 2\zeta\frac{s}{\omega_n} + \left(\frac{s}{\omega_n}\right)^2}, \quad s = j\omega,\quad x := \frac{\omega}{\omega_n}. \]

Substituting \( s = j\omega \) gives

\[ G_{cp}(j\omega) = \frac{1}{1 + j2\zeta x - x^2} = \frac{1}{(1 - x^2) + j(2\zeta x)}. \]

Hence

\[ |G_{cp}(j\omega)| = \frac{1}{\sqrt{(1 - x^2)^2 + (2\zeta x)^2}}, \quad \phi_{cp}(\omega) = -\arctan\left(\frac{2\zeta x}{1 - x^2}\right)\cdot\frac{180}{\pi}. \]

For \( \zeta < \tfrac{1}{\sqrt{2}} \), the magnitude exhibits a resonant peak near \( \omega \approx \omega_n \sqrt{1 - 2\zeta^2} \). The low- and high-frequency asymptotes are

\[ |G_{cp}(j\omega)| \approx \begin{cases} 1, & x \ll 1, \\ \dfrac{1}{x^2}, & x \gg 1, \end{cases} \quad M_{cp}(\omega) \approx \begin{cases} 0 \text{ dB}, & x \ll 1, \\ -40\log_{10} x \text{ dB}, & x \gg 1, \end{cases} \]

i.e., the slope changes from 0 dB/dec to -40 dB/dec at \( \omega = \omega_n \). The phase transitions from \(0^{\circ}\) to \(-180^{\circ}\) with a steep change in the vicinity of \( \omega_n \).

Complex zero pair. A complex zero factor is

\[ G_{cz}(s) = 1 + 2\zeta_z\frac{s}{\omega_z} + \left(\frac{s}{\omega_z}\right)^2. \]

Its magnitude and phase are the reciprocals of the complex pole case:

\[ |G_{cz}(j\omega)| = \frac{1}{|G_{cp}(j\omega)|}, \quad \phi_{cz}(\omega) = -\phi_{cp}(\omega), \]

with \( \omega_n \) replaced by \( \omega_z \) and \( \zeta \) by \( \zeta_z \). Consequently, the asymptotic slope change is from 0 dB/dec to +40 dB/dec, and the phase goes from \(0^{\circ}\) to \(+180^{\circ}\).

For control design, complex poles in the loop transfer function are directly related to overshoot and oscillations in time-domain response, while complex zeros can introduce non-minimum-phase behavior when they are in the right-half plane (not yet considered in this chapter).

4. Pure Time Delay and Its Bode Representation

A pure time delay of length \( T > 0 \) is represented in the Laplace domain by

\[ G_{\text{delay}}(s) = e^{-sT}. \]

Evaluated at \( s = j\omega \) we obtain

\[ G_{\text{delay}}(j\omega) = e^{-j\omega T} = \cos(\omega T) - j\sin(\omega T). \]

Therefore,

\[ |G_{\text{delay}}(j\omega)| = 1, \quad M_{\text{delay}}(\omega) = 0 \text{ dB}, \]

and the phase is a strictly linear function of frequency:

\[ \phi_{\text{delay}}(\omega) = -\omega T \cdot \frac{180}{\pi} \text{ degrees}. \]

Thus, a pure delay introduces no magnitude change, but a phase lag that grows unboundedly with frequency. In the Bode phase plot this appears as a straight line of slope \( -T \cdot 180/\pi \) degrees per rad/s.

For loop stability, this additional phase lag reduces the phase margin without affecting the gain. Even modest delays can severely degrade stability when the loop bandwidth is high.

Many analytical tools in classical control prefer rational transfer functions. For that purpose, we approximate the delay with a rational function using a first-order Padé approximation:

\[ e^{-sT} \approx \frac{1 - \frac{sT}{2}}{1 + \frac{sT}{2}} = \frac{1 - \frac{T}{2}s}{1 + \frac{T}{2}s}, \]

which introduces an equivalent real zero at \( s = -2/T \) and a real pole at \( s = -2/T \). The Bode plot of this approximation reproduces the near-bandwidth phase behavior of the true delay while remaining rational, which is convenient for CAD tools and analytical design.

flowchart TD
  T0["Start with plant P(s) (no delay)"] --> TD["Identify physical delay T (sensors, computation, actuators)"]
  TD --> FR["Frequency response: multiply by exp(-s T)"]
  FR --> Bmag["Magnitude: unchanged (0 dB)"]
  FR --> Bphase["Phase: -omega * T (linear)"]
  Bphase --> PM["Reduced phase margin at crossover"]
  PM --> DEC["Design actions: \nlower bandwidth or \nadd phase lead"]
  PM --> PAD["For analysis: \nreplace delay by rational \napprox (e.g. Pade 1,1)"]
        

5. Worked Example: Joint-Actuator Plant with Zero, Complex Poles, and Delay

Consider a simplified open-loop model of a robot joint actuator:

\[ G(s) = K \frac{1 + \frac{s}{z}} {1 + 2\zeta\frac{s}{\omega_n} + \left(\frac{s}{\omega_n}\right)^2} e^{-sT}, \]

where:

  • \( K = 10 \) is the low-frequency gain,
  • \( z = 10 \) rad/s is a real zero from motor current dynamics,
  • \( \omega_n = 20 \) rad/s and \( \zeta = 0.3 \) parameterize the complex pole pair associated with inertia and compliance,
  • \( T = 0.02 \) s models computation and communication delay.

The total Bode magnitude and phase can be approximated by summing contributions:

  • Gain \(K\). Adds a constant magnitude offset \( 20\log_{10} K = 20 \) dB, no phase change.
  • Real zero at \( z=10 \). Break at 10 rad/s, magnitude slope +20 dB/dec above 10 rad/s; phase increases from 0 to 90 degrees.
  • Complex poles at \( \omega_n=20, \zeta=0.3 \). Magnitude approximately flat up to 20 rad/s, then falls at -40 dB/dec with a resonant peak near \( \omega \approx 20\sqrt{1 - 2(0.3)^2} \) rad/s. Phase drops from 0 to -180 degrees.
  • Delay \(T=0.02\). Magnitude unchanged, phase contributes \( -\omega T \cdot 180/\pi \) degrees. At \( \omega = 50 \) rad/s this is approximately \( -50 \cdot 0.02 \cdot 180/\pi \approx -57^{\circ} \).

This example illustrates how the Bode phase can become very negative near crossover, even when the underlying plant does not have many poles: a single complex pole pair plus delay can already consume most of the phase margin.

6. Python Implementation: Bode Plot for a Delayed Robot Joint Model

In Python, the python-control library can generate Bode plots for transfer functions with zeros, complex poles, and delays. Robotics-oriented toolboxes (e.g., roboticstoolbox) can provide joint-space models that can then be linearized and passed to python-control.


import numpy as np
import matplotlib.pyplot as plt
import control as ct

# Example parameters for a robot joint actuator
K = 10.0
z = 10.0       # real zero (rad/s)
wn = 20.0      # natural frequency of complex poles
zeta = 0.3     # damping ratio
Tdelay = 0.02  # pure time delay (s)

# Define s as the Laplace variable
s = ct.TransferFunction.s

# Second-order complex pole pair in denominator
G_poles = 1.0 / (1 + 2*zeta * (s/wn) + (s/wn)**2)

# Real zero in numerator
G_zero = 1 + s/z

# Use a first-order Pade approximation for the delay
num_d, den_d = ct.pade(Tdelay, 1)  # (1,1) Pade approximation
G_delay = ct.TransferFunction(num_d, den_d)

# Complete plant model
G = K * G_zero * G_poles * G_delay

# Frequency range relevant for robot joint bandwidth
omega = np.logspace(0, 3, 500)  # 1 to 1000 rad/s

mag, phase, w = ct.bode(G, omega, Plot=False)

# Plot Bode magnitude
plt.figure()
plt.semilogx(w, 20*np.log10(mag))
plt.xlabel("omega (rad/s)")
plt.ylabel("Magnitude (dB)")
plt.title("Bode Magnitude: Robot Joint Plant with Zero, Complex Poles, Delay")
plt.grid(True, which="both")

# Plot Bode phase
plt.figure()
plt.semilogx(w, phase * 180.0/np.pi)
plt.xlabel("omega (rad/s)")
plt.ylabel("Phase (deg)")
plt.title("Bode Phase: Robot Joint Plant with Zero, Complex Poles, Delay")
plt.grid(True, which="both")

plt.show()

# Robotics context (conceptual):
# In a robotics stack, this G(s) may represent a linearized joint model derived from
# robot dynamics (e.g., via roboticstoolbox) around a nominal pose, and the Bode plot
# is used to design joint-space feedback gains.
      

In a full robotic workflow, one typically:

  1. Derives the joint-space dynamics from rigid-body modeling.
  2. Linearizes around a nominal configuration and velocity.
  3. Uses a transfer-function representation and Bode plots to choose feedback gains.

7. C++ Implementation: Evaluating Bode Data Numerically

In real-time robotic control (e.g., ROS controllers), the plant model may be implemented in C++ for simulation or off-line analysis. Below is a simple C++ program that samples the Bode magnitude and phase of the same plant using std::complex.


#include <iostream>
#include <vector>
#include <complex>
#include <cmath>

int main() {
    const double K = 10.0;
    const double z = 10.0;
    const double wn = 20.0;
    const double zeta = 0.3;
    const double Tdelay = 0.02;

    // Frequency grid (rad/s)
    std::vector<double> omega;
    for (int k = 0; k <= 100; ++k) {
        double exp10 = 0.0 + 3.0 * k / 100.0;  // from 10^0 to 10^3
        omega.push_back(std::pow(10.0, exp10));
    }

    using cd = std::complex<double>;
    const cd j(0.0, 1.0);

    for (double w : omega) {
        cd s = j * w;

        // Real zero: 1 + s/z
        cd G_zero = 1.0 + s / z;

        // Complex pole pair: 1 / (1 + 2*zeta*s/wn + (s/wn)^2)
        cd denom = 1.0 + 2.0 * zeta * s / wn + (s / wn) * (s / wn);
        cd G_poles = 1.0 / denom;

        // Pure delay: exp(-s T)
        cd G_delay = std::exp(-s * Tdelay);

        cd G = K * G_zero * G_poles * G_delay;

        double mag = std::abs(G);
        double phase_rad = std::arg(G);
        double mag_dB = 20.0 * std::log10(mag);
        double phase_deg = phase_rad * 180.0 / M_PI;

        std::cout << w
                  << " " << mag_dB
                  << " " << phase_deg
                  << std::endl;
    }

    return 0;
}
      

The resulting data can be plotted (e.g., using Python, MATLAB, or gnuplot) to obtain the Bode diagram. In robotics frameworks such as ROS, similar models may be used in off-line tuning tools for joint or end-effector controllers.

8. Java Implementation: Bode Sampling for Mechatronic Systems

Java can be used for control design in mechatronic or educational environments (e.g., FIRST Robotics). Using org.apache.commons.math3.complex.Complex, we can compute Bode samples for a plant with zeros, complex poles, and delay.


import java.util.ArrayList;
import java.util.List;
import org.apache.commons.math3.complex.Complex;

public class BodeExample {
    public static void main(String[] args) {
        double K = 10.0;
        double z = 10.0;
        double wn = 20.0;
        double zeta = 0.3;
        double Tdelay = 0.02;

        List<Double> omega = new ArrayList<>();
        for (int k = 0; k <= 100; ++k) {
            double exp10 = 0.0 + 3.0 * k / 100.0;
            omega.add(Math.pow(10.0, exp10));
        }

        Complex j = new Complex(0.0, 1.0);

        for (double w : omega) {
            Complex s = j.multiply(w);

            Complex G_zero = Complex.ONE.add(s.divide(z));

            Complex denom = Complex.ONE
                    .add(s.multiply(2.0 * zeta / wn))
                    .add(s.divide(wn).multiply(s.divide(wn)));
            Complex G_poles = Complex.ONE.divide(denom);

            Complex G_delay = (new Complex(0.0, -w * Tdelay)).exp();

            Complex G = G_zero.multiply(G_poles).multiply(G_delay).multiply(K);

            double mag = G.abs();
            double magDB = 20.0 * Math.log10(mag);
            double phaseRad = G.getArgument();
            double phaseDeg = phaseRad * 180.0 / Math.PI;

            System.out.println(w + " " + magDB + " " + phaseDeg);
        }
    }
}
      

Such Java code can be integrated into tuning utilities for mechatronic systems where real-time constraints are handled by a lower-level controller, while Bode-based analysis is done off-line.

9. MATLAB / Simulink Implementation for Control Design

MATLAB and Simulink offer native support for transfer functions with zeros, poles, and delays. For robotic joints, such models can be derived from Simscape Multibody or symbolic dynamics and analyzed with Bode plots.


% Parameters
K = 10;
z = 10;
wn = 20;
zeta = 0.3;
Tdelay = 0.02;

s = tf('s');

% Real zero and complex pole pair
G_zero = 1 + s/z;
G_poles = 1 / (1 + 2*zeta*(s/wn) + (s/wn)^2);

% Exact delay in MATLAB (handled symbolically by control functions)
G_delay = exp(-Tdelay*s);

% Complete plant
G_exact = K * G_zero * G_poles * G_delay;

% For some algorithms, use Pade approximation:
[numd, dend] = pade(Tdelay, 1);
G_pade = K * G_zero * G_poles * tf(numd, dend);

% Bode plots
omega = logspace(0, 3, 500);
figure;
bode(G_exact, omega); grid on;
title('Bode of G(s) with exact delay');

figure;
bode(G_pade, omega); grid on;
title('Bode of G(s) with Pade-approximated delay');

% Simulink:
%  - Use "Transfer Fcn" blocks for the zero/pole part.
%  - Use "Transport Delay" to represent e^{-sT}.
%  - Use "Bode Plot" (Control System Toolbox) for frequency-domain analysis.
      

In robot joint control, one can embed this plant in a loop with a position or torque controller and interactively modify controller parameters while observing Bode plots and phase margins.

10. Wolfram Mathematica Implementation

Wolfram Mathematica provides symbolic and numeric tools for building and analyzing transfer functions. Time delay can be modeled either exactly or via Padé approximation.


(* Parameters *)
K = 10.;
z = 10.;
wn = 20.;
zeta = 0.3;
Tdelay = 0.02;

s = LaplaceTransformVariable;

(* Define the zero and complex pole pair *)
Gzero[s_] := 1 + s/z;
Gpoles[s_] := 1/(1 + 2 zeta s/wn + (s/wn)^2);

(* Pure delay factor *)
GdelayExact[s_] := Exp[-Tdelay s];

(* Combined exact transfer function *)
Gexact[s_] := K Gzero[s] Gpoles[s] GdelayExact[s];

(* Convert to TransferFunctionModel via Pade approximation of the delay *)
padeOrder = {1, 1};
GdelayPade[s_] := PadeApproximant[Exp[-Tdelay s], {s, 0, padeOrder}];

Gpade[s_] := K Gzero[s] Gpoles[s] GdelayPade[s];

tf = TransferFunctionModel[Gpade[s], s];

(* Bode plot over a frequency range *)
BodePlot[tf, {10^-0, 10^3},
  ScalingFunctions -> {"Log", "dB"},
  PlotRange -> All,
  FrameLabel -> { {"Magnitude (dB)", "Phase (deg)"}, {"omega (rad/s)", None} }
]
      

Mathematica is especially useful for symbolic exploration of how complex zeros, poles, and delays influence transfer-function properties before numerical controller synthesis.

11. Problems and Solutions

Problem 1 (Real zero and real poles in Bode plots). Consider the open-loop transfer function

\[ G_1(s) = 5 \frac{1 + \frac{s}{2}}{s\left(1 + \frac{s}{10}\right)}. \]

(a) List the poles, zeros, and their break frequencies. (b) Sketch the asymptotic Bode magnitude plot, indicating slopes in dB/dec. (c) Describe the qualitative phase behavior as a function of frequency.

Solution:

(a) There is a zero at \( s = -2 \), a pole at \( s = 0 \), and a real pole at \( s = -10 \). The corresponding break frequencies are \( \omega = 2 \) and \( \omega = 10 \) rad/s.

(b) We decompose

\[ G_1(s) = 5 \cdot \frac{1}{s} \cdot \frac{1 + \frac{s}{2}}{1 + \frac{s}{10}}. \]

  • The constant gain \( 5 \) contributes \( 20\log_{10} 5 \approx 14 \) dB.
  • The pole at the origin \( 1/s \) has magnitude \( |1/j\omega| = 1/\omega \), i.e. a slope of -20 dB/dec across all frequencies.
  • The zero at 2 rad/s gives slope change of +20 dB/dec for \( \omega > 2 \).
  • The pole at 10 rad/s gives slope change of -20 dB/dec for \( \omega > 10 \).

Starting just above \( \omega = 0 \), the total slope is -20 dB/dec from the integrator. After 2 rad/s, the zero cancels this, leading to slope 0 dB/dec (flat). After 10 rad/s, the additional pole yields slope -20 dB/dec again.

(c) The integrator contributes \(-90^{\circ}\) across all frequencies. The zero introduces a phase rise from \( 0^{\circ} \) to \( +90^{\circ} \) centered at 2 rad/s, while the real pole at 10 rad/s introduces a phase drop from \( 0^{\circ} \) to \( -90^{\circ} \). Summing contributions, the total phase starts near \(-90^{\circ}\) at low frequency, rises toward \( 0^{\circ} \) as the zero acts, then falls toward \(-90^{\circ}\) again at high frequencies.


Problem 2 (Complex poles and resonant peak). A second-order factor

\[ G_2(s) = \frac{1}{1 + 2\zeta\frac{s}{\omega_n} + \left(\frac{s}{\omega_n}\right)^2} \]

has \( \zeta = 0.2 \) and \( \omega_n = 50 \) rad/s. (a) Compute the approximate resonant frequency. (b) Derive the exact magnitude at \( \omega = \omega_n \). (c) Comment on how decreasing \( \zeta \) affects the Bode magnitude.

Solution:

(a) For \( \zeta < 1/\sqrt{2} \), the resonant frequency is approximately

\[ \omega_r \approx \omega_n \sqrt{1 - 2\zeta^2} = 50\sqrt{1 - 2(0.2)^2} = 50\sqrt{1 - 0.08} \approx 50\sqrt{0.92} \approx 50 \cdot 0.959 = 47.95 \text{ rad/s}. \]

(b) At \( \omega = \omega_n \), we have \( x = \omega/\omega_n = 1 \), thus

\[ |G_2(j\omega_n)| = \frac{1}{\sqrt{(1 - 1)^2 + (2\zeta)^2}} = \frac{1}{2\zeta} = \frac{1}{0.4} = 2.5. \]

In decibels, this is

\[ 20\log_{10} 2.5 \approx 7.96 \text{ dB}. \]

(c) As \( \zeta \) decreases, the denominator at \( \omega_n \) decreases, so the resonant peak magnitude \( 1/(2\zeta) \) increases. Thus the Bode magnitude plot exhibits a taller and narrower resonance for small damping, which corresponds to more oscillatory time-domain response.


Problem 3 (Time delay and phase margin). An open-loop system without delay has loop transfer function \( L_0(s) \). At the gain crossover frequency \( \omega_c = 20 \) rad/s, its phase is \( \phi_0(\omega_c) = -120^{\circ} \). A pure time delay \( T \) is introduced, so the new loop transfer function is \( L(s) = L_0(s)e^{-sT} \).

(a) Express the new phase at \( \omega_c \) as a function of \( T \). (b) Find the largest \( T \) such that the phase margin remains at least \( 30^{\circ} \).

Solution:

(a) The delay adds a phase contribution

\[ \phi_{\text{delay}}(\omega) = -\omega T \cdot \frac{180}{\pi}. \]

Thus the new phase at \( \omega_c \) is

\[ \phi(\omega_c) = \phi_0(\omega_c) - \omega_c T \cdot \frac{180}{\pi} = -120^{\circ} - 20 T \cdot \frac{180}{\pi}. \]

(b) The phase margin is defined as \( \text{PM} = 180^{\circ} + \phi(\omega_c) \), so

\[ \text{PM}(T) = 180^{\circ} -120^{\circ} - 20 T \cdot \frac{180}{\pi} = 60^{\circ} - 20 T \cdot \frac{180}{\pi}. \]

We require \( \text{PM}(T) \ge 30^{\circ} \), hence

\[ 60^{\circ} - 20 T \cdot \frac{180}{\pi} \ge 30^{\circ} \quad \Rightarrow \quad 20 T \cdot \frac{180}{\pi} \le 30^{\circ} \quad \Rightarrow \quad T \le \frac{30^{\circ}\pi}{20\cdot 180^{\circ}} = \frac{\pi}{120} \approx 0.0262 \text{ s}. \]

Thus, to maintain a phase margin of at least \( 30^{\circ} \), the delay must satisfy \( T \le 0.0262 \) s.


Problem 4 (Combined zero, complex poles, and delay). For the plant

\[ G(s) = 10 \frac{1 + \frac{s}{10}} {1 + 2(0.4)\frac{s}{30} + \left(\frac{s}{30}\right)^2} e^{-0.01 s}, \]

qualitatively describe how each factor (gain, zero, complex poles, delay) shapes the Bode magnitude and phase plots. In particular, discuss what happens near the natural frequency \( \omega_n = 30 \) rad/s.

Solution:

  • Gain 10. Adds a uniform 20 dB offset to the magnitude, no phase effect.
  • Zero at 10 rad/s. Below 10 rad/s its contribution to magnitude is negligible; above 10 rad/s it adds +20 dB/dec slope and contributes phase up to +90 degrees centered around 10 rad/s.
  • Complex poles at 30 rad/s, \( \zeta = 0.4 \). Below 30 rad/s the pole pair has near-zero effect on magnitude and phase. Around 30 rad/s an inflection occurs; for this relatively small damping, a mild resonant peak appears near \( \omega \approx 30\sqrt{1 - 2(0.4)^2} \) rad/s. Above 30 rad/s the slope asymptotically approaches -40 dB/dec and the phase tends toward -180 degrees.
  • Delay 0.01 s. Magnitude remains unchanged; phase is reduced by an additional term \(-\omega T \cdot 180/\pi\) degrees, which becomes moderate around 30 rad/s and significant at higher frequencies. This extra lag reduces phase margin and can move the phase at gain crossover closer to \(-180^{\circ}\).

Near \( \omega = 30 \) rad/s, all three dynamic elements (zero, complex poles, and delay) influence phase simultaneously. The zero tends to increase phase, while the poles and delay reduce it; the net effect on phase margin depends on the loop gain and chosen crossover frequency.

12. Summary

In this lesson we extended Bode plot construction to include real zeros, complex conjugate poles and zeros, and pure time delay. Using factorization of the transfer function, we derived explicit magnitude and phase formulas and identified their asymptotic slopes and break frequencies. Complex poles give rise to resonant peaks and phase drops up to \(-180^{\circ}\), while complex zeros have the opposite effect. Time delay introduces no magnitude distortion but produces a linear, unbounded phase lag that severely affects phase margin. We implemented numerical Bode computation in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica, emphasizing their application to robotic joint-actuator models. These concepts form the basis for approximate hand construction of Bode plots (next lesson) and for assessing stability and robustness directly from frequency response.

13. References

  1. Bode, H.W. (1945). Network Analysis and Feedback Amplifier Design. Van Nostrand, New York.
  2. Nyquist, H. (1932). Regeneration theory. Bell System Technical Journal, 11(1), 126–147.
  3. Black, H.S. (1934). Stabilized feedback amplifiers. Bell System Technical Journal, 13(1), 1–18.
  4. Ziegler, J.G., & Nichols, N.B. (1942). Optimum settings for automatic controllers. Transactions of the ASME, 64, 759–768.
  5. Ho, B.L., & Narendra, K.S. (1969). Approximation of linear systems by systems of lower order. IEEE Transactions on Automatic Control, 14(5), 475–480.
  6. Astrom, K.J., & Hagglund, T. (1984). Automatic tuning of simple regulators with specifications on phase and amplitude margin. Automatica, 20(5), 645–651.
  7. Maciejowski, J.M. (1989). Multivariable Feedback Design. Addison-Wesley (frequency-domain design chapters).
  8. Chen, J., & Francis, B.A. (1995). Optimal Sampled-Data Control Systems. Springer (for rigorous treatment of delay and frequency response).