Chapter 12: Frequency Response and Resonance
Lesson 4: Nyquist and Nichols Plots (Introductory Level)
This lesson introduces Nyquist and Nichols plots as alternative (and complementary) visualizations of the frequency response. We develop them directly from \( G(j\omega) \), establish their geometric meaning in the complex plane, and connect them to resonance and unity-feedback behavior through the characteristic equation \( 1 + G(s) = 0 \). We also derive the basic Nichols-chart closed-loop magnitude relation and implement the plots in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica.
1. Conceptual Overview
From Lesson 1, the (open-loop) frequency response of an LTI system with transfer function \( G(s) \) is obtained by the substitution \( s → j\omega \), producing the complex-valued function \( G(j\omega) \).
If \( G(s) = \dfrac{N(s)}{D(s)} \) with real coefficients, then for each real frequency \( \omega \in \mathbb{R} \), the value \( G(j\omega) \) is a complex number. Nyquist and Nichols plots are simply different ways to draw the same information:
- Nyquist plot: plot the locus of \( G(j\omega) \) in the complex plane as \( \omega \) varies (frequency is a parameter).
- Nichols plot: plot \( 20\log_{10}|G(j\omega)| \) versus \( \angle G(j\omega) \) (again frequency is a parameter).
flowchart TD
A["Start: Transfer function G(s)"] --> B["Choose frequency grid \nw = logspace(...)"]
B --> C["Compute G(jw) for each w"]
C --> D["Nyquist: plot \n(Re(G), Im(G))"]
C --> E["Nichols: plot \n(phase_deg(G), mag_dB(G))"]
D --> F["Interpret: closeness to (-1,0), \nloop shape, resonance as large radius"]
E --> G["Interpret: gain/phase trends, \nresonance as magnitude peak, chart overlays"]
Throughout, we will use the polar form \( G(j\omega) = r(\omega)e^{j\phi(\omega)} \), where \( r(\omega)=|G(j\omega)| \) and \( \phi(\omega)=\angle G(j\omega) \). The same point in the Nyquist plane has Cartesian coordinates:
\[ \Re\{G(j\omega)\} = r(\omega)\cos(\phi(\omega)),\qquad \Im\{G(j\omega)\} = r(\omega)\sin(\phi(\omega)). \]
2. Nyquist Plot: Definition and Fundamental Properties
Let \( G(s) \) be a proper rational transfer function with real coefficients. The Nyquist locus is the set \( \{G(j\omega): \omega \in \mathbb{R}\} \subset \mathbb{C} \). In practice, we sample \( \omega \) over a wide band and draw the parametric curve.
Writing \( G(j\omega) = \dfrac{N(j\omega)}{D(j\omega)} \), the Nyquist curve is the image of the imaginary axis under the mapping \( s \mapsto G(s) \) restricted to \( s = j\omega \).
2.1 Conjugate Symmetry (Real-Coefficient Systems)
A key property (used in plotting) is that the negative-frequency part is the complex conjugate of the positive-frequency part.
Proposition: If \( G(s) \) has real coefficients, then
\[ G(-j\omega) = \overline{G(j\omega)} \quad \text{for all real } \omega. \]
Proof: For a polynomial with real coefficients, complex conjugation commutes with evaluation:
\[ \overline{N(j\omega)} = N(\overline{j\omega}) = N(-j\omega),\qquad \overline{D(j\omega)} = D(\overline{j\omega}) = D(-j\omega). \]
Therefore, \( \overline{G(j\omega)} = \dfrac{\overline{N(j\omega)}}{\overline{D(j\omega)}} = \dfrac{N(-j\omega)}{D(-j\omega)} = G(-j\omega) \). □
Consequently, it is enough to compute the curve for \( \omega > 0 \) and reflect it across the real axis to obtain \( \omega < 0 \).
2.2 Resonance Interpreted on the Nyquist Curve
For systems with a lightly damped mode (Lesson 3), the magnitude \( |G(j\omega)| \) can become large near the resonant frequency. In the Nyquist plane, “large magnitude” means the curve moves far from the origin.
Example second-order factor (from Lesson 3): \( G_2(s)=\dfrac{\omega_n^2}{s^2+2\zeta\omega_n s+\omega_n^2} \). Its frequency-response magnitude is
\[ |G_2(j\omega)| = \frac{\omega_n^2}{\sqrt{(\omega_n^2-\omega^2)^2+(2\zeta\omega_n\omega)^2}}. \]
For \( \zeta < 1/\sqrt{2} \), the peak occurs at \( \omega_r = \omega_n\sqrt{1-2\zeta^2} \), so around \( \omega \approx \omega_r \) the Nyquist curve typically “bulges” outward.
3. Why the Point -1 Matters in Unity Feedback
Consider unity negative feedback with open-loop transfer \( G(s) \). The closed-loop transfer function is \( T(s) = \dfrac{G(s)}{1+G(s)} \), and the closed-loop characteristic equation is:
\[ 1 + G(s) = 0. \]
On the imaginary axis \( s = j\omega \), a marginal condition occurs when \( 1 + G(j\omega) = 0 \), i.e.,
\[ G(j\omega) = -1 + j0. \]
Thus, if the Nyquist curve passes exactly through the point \( -1 \), the closed loop is at the boundary of stability (this connects to the stability concepts covered in Chapter 11).
3.1 Gain and Phase Conditions for Crossing -1
Using polar form \( G(j\omega)=r(\omega)e^{j\phi(\omega)} \), the equality \( G(j\omega)=-1 \) is equivalent to the simultaneous conditions:
\[ r(\omega)=1,\qquad \phi(\omega) = (2k+1)\pi,\; k\in\mathbb{Z}. \]
In Bode terminology, these correspond to “0 dB magnitude” and “-180° phase” at the same frequency. Nyquist and Nichols plots visualize these conditions geometrically.
3.2 (Brief) Encirclement Logic from the Argument Principle
Chapter 11 developed the idea that closed-loop stability is tied to the roots of \( 1+G(s) \). A core theoretical bridge is the argument principle applied to \( 1+G(s) \) along the Nyquist contour (details are expanded in stability-focused lessons).
If \( P \) is the number of right-half-plane poles of \( 1+G(s) \) (equivalently the RHP poles of \( G(s) \)) and \( Z \) is the number of right-half-plane zeros of \( 1+G(s) \) (i.e., RHP closed-loop poles), then the net number \( N \) of clockwise encirclements of \( -1 \) by the Nyquist plot satisfies:
\[ N = Z - P. \]
In the common introductory case where \( P=0 \) (open-loop stable), closed-loop stability requires \( Z=0 \), hence the Nyquist plot must have \( N=0 \) net encirclements of \( -1 \).
4. Nichols Plot: Definition and Closed-Loop Magnitude Relation
The Nichols plot uses the same polar data \( r(\omega), \phi(\omega) \), but places them on axes that are closer to Bode interpretation:
- Horizontal axis: \( \phi(\omega) \) in degrees.
- Vertical axis: \( 20\log_{10}(r(\omega)) \) in dB.
Therefore, the Nichols curve is simply the parametric curve: \( (\phi(\omega), 20\log_{10} r(\omega)) \). Mapping back to Nyquist is immediate via:
\[ r(\omega) = 10^{\frac{M_{dB}(\omega)}{20}},\qquad \Re\{G(j\omega)\} = r(\omega)\cos(\phi(\omega)),\qquad \Im\{G(j\omega)\} = r(\omega)\sin(\phi(\omega)). \]
4.1 Closed-Loop Magnitude as a Function of Open-Loop Polar Data
For unity feedback, \( T(s)=\dfrac{G(s)}{1+G(s)} \). At frequency \( \omega \):
\[ T(j\omega)=\frac{G(j\omega)}{1+G(j\omega)}. \]
Let \( G(j\omega)=re^{j\phi} \). Then \( 1+G(j\omega)=1+re^{j\phi} \) and:
\[ |1+re^{j\phi}|^2 = (1+re^{j\phi})(1+re^{-j\phi}) = 1 + r^2 + 2r\cos\phi. \]
Hence the closed-loop magnitude ratio \( M(\omega)=|T(j\omega)| \) satisfies:
\[ M^2 = \frac{|G|^2}{|1+G|^2} = \frac{r^2}{1+r^2+2r\cos\phi}. \]
This single formula is the mathematical reason Nichols charts are useful: lines of constant \( M \) (constant closed-loop magnitude) can be overlaid on the Nichols plane and compared against the open-loop Nichols curve.
4.2 Deriving the Constant-\( M \) Contour Equation (Introductory Derivation)
Fix a constant \( M \). From \( M^2=\dfrac{r^2}{1+r^2+2r\cos\phi} \), rearrange:
\[ M^2(1+r^2+2r\cos\phi)=r^2 \;\;\Longleftrightarrow\;\; (M^2-1)r^2 + 2M^2(\cos\phi)\,r + M^2 = 0. \]
This is a quadratic equation in \( r \) for each phase \( \phi \). Solving gives:
\[ r = \frac{-M^2\cos\phi \pm M\sqrt{1 - M^2\sin^2\phi}}{M^2 - 1}, \quad \text{provided } 1 - M^2\sin^2\phi \ge 0. \]
After computing \( r \), convert to dB via \( 20\log_{10}r \). While full Nichols charts include many standard overlays, the key point here is that closed-loop magnitude can be derived from open-loop \( (r,\phi) \) data in a purely algebraic way.
flowchart TD
A["Frequency w"] --> B["Open-loop point G(jw) in complex plane"]
B --> C["Polar: r=|G|, phi=arg(G)"]
C --> D["Nichols coordinates: \n(phi_deg, 20log10(r))"]
B --> E["Unity feedback: \nT = G/(1+G)"]
C --> F["Closed-loop magnitude: \nM^2 = r^2/(1+r^2+2r cos(phi))"]
5. Implementation Labs
We implement Nyquist/Nichols plotting around an example plant that includes a lightly damped resonant mode and an additional real pole: \( G(s) = K \dfrac{\omega_n^2}{s^2 + 2\zeta\omega_n s + \omega_n^2}\dfrac{1}{\tau s + 1} \).
5.1 Python (python-control)
File: Chapter12_Lesson4.py
# Chapter12_Lesson4.py
# Nyquist and Nichols Plots (Introductory Level) — Frequency Response and Resonance
#
# Dependencies:
# pip install control numpy matplotlib
#
# Output files:
# - Chapter12_Lesson4_nyquist.png
# - Chapter12_Lesson4_nichols.png
# - Chapter12_Lesson4_freqresp.csv
import numpy as np
import matplotlib.pyplot as plt
try:
import control # python-control
except ImportError as e:
raise SystemExit("Missing dependency 'control'. Install with: pip install control") from e
def poly_eval_complex(coeffs, s):
"""Evaluate polynomial with real coefficients at complex s (highest power first)."""
y = 0.0 + 0.0j
for c in coeffs:
y = y * s + c
return y
def tf_freqresp_manual(num, den, w):
"""Manual complex frequency response G(jw) for transfer function num(s)/den(s)."""
Gjw = np.zeros_like(w, dtype=np.complex128)
for k, wk in enumerate(w):
s = 1j * wk
Gjw[k] = poly_eval_complex(num, s) / poly_eval_complex(den, s)
return Gjw
# Example open-loop plant:
# G(s) = K * wn^2 / (s^2 + 2*zeta*wn*s + wn^2) * 1/(tau*s + 1)
K = 5.0
wn = 10.0
zeta = 0.20
tau = 0.05
num1 = [wn**2]
den1 = [1.0, 2*zeta*wn, wn**2]
num2 = [1.0]
den2 = [tau, 1.0]
sys = K * control.tf(num1, den1) * control.tf(num2, den2)
w = np.logspace(-1, 2.5, 1500) # rad/s
Gjw = np.array([control.evalfr(sys, 1j*wk) for wk in w], dtype=np.complex128)
# Cross-check via manual polynomial evaluation
num = np.polymul(np.array(num1), np.array(num2)) * K
den = np.polymul(np.array(den1), np.array(den2))
Gjw_manual = tf_freqresp_manual(num, den, w)
print("Max |Gjw - Gjw_manual| =", np.max(np.abs(Gjw - Gjw_manual)))
mag = np.abs(Gjw)
phase = np.angle(Gjw, deg=True)
mag_db = 20*np.log10(mag)
np.savetxt(
"Chapter12_Lesson4_freqresp.csv",
np.column_stack([w, Gjw.real, Gjw.imag, mag_db, phase]),
delimiter=",",
header="omega_rad_s,ReG,ImG,Mag_dB,Phase_deg",
comments=""
)
# Nyquist
plt.figure()
plt.plot(Gjw.real, Gjw.imag, linewidth=1.0, label="G(jw), w>0")
plt.plot(Gjw.real, -Gjw.imag, linewidth=1.0, label="G(jw), w<0 (symmetry)")
plt.scatter([-1.0], [0.0], s=35, marker="x", label="-1 point")
plt.axhline(0.0, linewidth=0.8)
plt.axvline(0.0, linewidth=0.8)
plt.gca().set_aspect("equal", adjustable="box")
plt.xlabel("Re{G(jw)}")
plt.ylabel("Im{G(jw)}")
plt.title("Nyquist Curve")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("Chapter12_Lesson4_nyquist.png", dpi=200)
# Nichols
phase_unwrapped = np.unwrap(np.deg2rad(phase))
phase_unwrapped_deg = np.rad2deg(phase_unwrapped)
plt.figure()
plt.plot(phase_unwrapped_deg, mag_db, linewidth=1.0)
plt.xlabel("Phase (deg)")
plt.ylabel("Magnitude (dB)")
plt.title("Nichols Curve")
plt.grid(True)
plt.tight_layout()
plt.savefig("Chapter12_Lesson4_nichols.png", dpi=200)
# Margins for unity feedback
gm, pm, wgc, wpc = control.margin(sys)
print("Gain margin (abs) =", gm)
print("Phase margin (deg) =", pm)
print("Gain crossover w_gc (rad/s) =", wgc)
print("Phase crossover w_pc (rad/s) =", wpc)
5.2 C++ (from-scratch frequency response sampling)
File: Chapter12_Lesson4.cpp
/* Chapter12_Lesson4.cpp
Nyquist and Nichols Plots (Introductory Level) — Frequency Response and Resonance
Build (example):
g++ -O2 -std=c++17 Chapter12_Lesson4.cpp -o Chapter12_Lesson4
Output:
- Chapter12_Lesson4_freqresp_cpp.csv
*/
#include <complex>
#include <vector>
#include <iostream>
#include <fstream>
#include <cmath>
static std::complex<double> poly_eval(const std::vector<double>& coeffs,
const std::complex<double>& s) {
std::complex<double> y(0.0, 0.0);
for (double c : coeffs) {
y = y * s + c;
}
return y;
}
static std::vector<double> logspace(double a, double b, int n) {
std::vector<double> w;
w.reserve(n);
for (int k = 0; k < n; ++k) {
double t = (n == 1) ? 0.0 : (double)k / (double)(n - 1);
double p = a + (b - a) * t;
w.push_back(std::pow(10.0, p));
}
return w;
}
int main() {
const double K = 5.0;
const double wn = 10.0;
const double zeta = 0.20;
const double tau = 0.05;
// num(s) = K*wn^2
std::vector<double> num = { K * wn * wn };
// den(s) = (s^2 + a1*s + a0)(b1*s + b0) expanded
const double a1 = 2.0 * zeta * wn;
const double a0 = wn * wn;
const double b1 = tau;
const double b0 = 1.0;
std::vector<double> den = {
b1,
(b0 + a1 * b1),
(a1 * b0 + a0 * b1),
(a0 * b0)
};
const int N = 1500;
std::vector<double> w = logspace(-1.0, 2.5, N);
std::ofstream ofs("Chapter12_Lesson4_freqresp_cpp.csv");
ofs << "omega_rad_s,ReG,ImG,Mag_dB,Phase_deg\n";
for (double wk : w) {
std::complex<double> s(0.0, wk); // j*w
std::complex<double> Gjw = poly_eval(num, s) / poly_eval(den, s);
double mag = std::abs(Gjw);
double mag_db = 20.0 * std::log10(mag);
double ph = std::arg(Gjw) * 180.0 / M_PI;
ofs << wk << "," << Gjw.real() << "," << Gjw.imag()
<< "," << mag_db << "," << ph << "\n";
}
return 0;
}
5.3 Java (Apache Commons Math Complex)
File: Chapter12_Lesson4.java
/* Chapter12_Lesson4.java
Nyquist and Nichols Plots (Introductory Level) — Frequency Response and Resonance
Dependency (Maven):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-math3</artifactId>
<version>3.6.1</version>
</dependency>
Output:
- Chapter12_Lesson4_freqresp_java.csv
*/
import org.apache.commons.math3.complex.Complex;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Chapter12_Lesson4 {
static Complex polyEval(double[] coeffs, Complex s) {
Complex y = Complex.ZERO;
for (double c : coeffs) {
y = y.multiply(s).add(new Complex(c, 0.0));
}
return y;
}
static double[] logspace(double a, double b, int n) {
double[] w = new double[n];
for (int k = 0; k < n; k++) {
double t = (n == 1) ? 0.0 : (double) k / (double) (n - 1);
double p = a + (b - a) * t;
w[k] = Math.pow(10.0, p);
}
return w;
}
public static void main(String[] args) throws IOException {
double K = 5.0, wn = 10.0, zeta = 0.20, tau = 0.05;
double[] num = new double[]{K * wn * wn};
double a1 = 2.0 * zeta * wn, a0 = wn * wn, b1 = tau, b0 = 1.0;
double[] den = new double[]{ b1, (b0 + a1*b1), (a1*b0 + a0*b1), (a0*b0) };
double[] w = logspace(-1.0, 2.5, 1500);
try (PrintWriter pw = new PrintWriter(new FileWriter("Chapter12_Lesson4_freqresp_java.csv"))) {
pw.println("omega_rad_s,ReG,ImG,Mag_dB,Phase_deg");
for (double wk : w) {
Complex s = new Complex(0.0, wk);
Complex Gjw = polyEval(num, s).divide(polyEval(den, s));
double magDb = 20.0 * Math.log10(Gjw.abs());
double phaseDeg = Math.atan2(Gjw.getImaginary(), Gjw.getReal()) * 180.0 / Math.PI;
pw.printf(java.util.Locale.US, "%.10f,%.10f,%.10f,%.10f,%.10f%n",
wk, Gjw.getReal(), Gjw.getImaginary(), magDb, phaseDeg);
}
}
}
}
5.4 MATLAB / Simulink
File: Chapter12_Lesson4.m
% Chapter12_Lesson4.m
% Nyquist and Nichols Plots (Introductory Level) — Frequency Response and Resonance
%
% Requirements:
% - Control System Toolbox (tf, nyquist, nichols, margin)
% Optional:
% - Simulink (programmatic model creation section at the bottom)
clear; clc; close all;
K = 5.0;
wn = 10.0;
zeta = 0.20;
tau = 0.05;
s = tf('s');
G = K * (wn^2)/(s^2 + 2*zeta*wn*s + wn^2) * 1/(tau*s + 1);
w = logspace(-1, 2.5, 1500);
figure; nyquist(G, w); grid on; title('Nyquist Curve');
saveas(gcf, 'Chapter12_Lesson4_nyquist_matlab.png');
figure; nichols(G, w); grid on; title('Nichols Curve');
saveas(gcf, 'Chapter12_Lesson4_nichols_matlab.png');
[Gm, Pm, Wcg, Wcp] = margin(G);
disp(['Gain margin (abs) = ', num2str(Gm)]);
disp(['Phase margin (deg) = ', num2str(Pm)]);
disp(['Gain crossover Wcg (rad/s) = ', num2str(Wcg)]);
disp(['Phase crossover Wcp (rad/s) = ', num2str(Wcp)]);
[mag, ph] = bode(G, w);
mag = squeeze(mag); ph = squeeze(ph);
mag_db = 20*log10(mag);
T = table(w(:), mag_db(:), ph(:), 'VariableNames', {'omega_rad_s','Mag_dB','Phase_deg'});
writetable(T, 'Chapter12_Lesson4_freqresp_matlab.csv');
% Optional: programmatic Simulink model section is included (commented) in the downloadable .m file.
5.5 Wolfram Mathematica
File: Chapter12_Lesson4.nb
(* Chapter12_Lesson4.nb
Nyquist and Nichols Plots (Introductory Level) — Frequency Response and Resonance
*)
Needs["ControlSystems`"]
K = 5.0; wn = 10.0; zeta = 0.20; tau = 0.05;
s = LaplaceTransform`Private`s;
G = K * (wn^2)/(s^2 + 2*zeta*wn*s + wn^2) * 1/(tau*s + 1);
sys = TransferFunctionModel[G, s];
wmin = 10^-1; wmax = 10^2.5;
NyquistPlot[sys, {wmin, wmax}, PlotLabel -> "Nyquist Curve", GridLines -> Automatic]
NicholsPlot[sys, {wmin, wmax}, PlotLabel -> "Nichols Curve", GridLines -> Automatic]
Margin[sys]
6. Problems and Solutions
Problem 1 (Nyquist symmetry): Let \( G(s)=\dfrac{N(s)}{D(s)} \) with real-coefficient polynomials \( N, D \). Prove that \( G(-j\omega)=\overline{G(j\omega)} \).
Solution: Use conjugation commutation with polynomial evaluation: \( \overline{N(j\omega)}=N(-j\omega) \) and \( \overline{D(j\omega)}=D(-j\omega) \). Then:
\[ \overline{G(j\omega)}=\frac{\overline{N(j\omega)}}{\overline{D(j\omega)}}= \frac{N(-j\omega)}{D(-j\omega)}=G(-j\omega). \]
Problem 2 (Cartesian from Nichols point): Suppose a Nichols coordinate at some frequency is magnitude \( M_{dB}=-6 \) dB and phase \( \phi=-135^\circ \). Compute the corresponding Nyquist point \( \Re\{G\},\Im\{G\} \).
Solution: Convert dB to magnitude:
\[ r = 10^{\frac{M_{dB}}{20}} = 10^{\frac{-6}{20}}. \]
Then use \( \Re\{G\}=r\cos\phi \), \( \Im\{G\}=r\sin\phi \):
\[ \Re\{G\}=10^{\frac{-6}{20}}\cos(-135^\circ),\qquad \Im\{G\}=10^{\frac{-6}{20}}\sin(-135^\circ). \]
Problem 3 (Condition to hit -1): Show that the Nyquist curve passes through \( -1 \) at some frequency if and only if there exists \( \omega_0 \) such that \( |G(j\omega_0)|=1 \) and \( \angle G(j\omega_0) = (2k+1)\pi \).
Solution: If \( G(j\omega_0)=-1 \), then in polar form \( -1 = 1\cdot e^{j(2k+1)\pi} \), hence \( r(\omega_0)=1 \) and \( \phi(\omega_0)=(2k+1)\pi \). Conversely, if those hold then \( G(j\omega_0)=1\cdot e^{j(2k+1)\pi}=-1 \). □
Problem 4 (Derive constant-\( M \) relation): For unity feedback \( T=\dfrac{G}{1+G} \), let \( G=re^{j\phi} \). Derive \( M^2=\dfrac{r^2}{1+r^2+2r\cos\phi} \).
Solution: Start from \( T=\dfrac{re^{j\phi}}{1+re^{j\phi}} \):
\[ M^2 = |T|^2 = \frac{|re^{j\phi}|^2}{|1+re^{j\phi}|^2}=\frac{r^2}{|1+re^{j\phi}|^2}. \]
Compute the denominator magnitude squared by multiplying by the conjugate:
\[ |1+re^{j\phi}|^2 = (1+re^{j\phi})(1+re^{-j\phi}) = 1+r^2+2r\cos\phi. \]
Substitute into the expression for \( M^2 \) to finish. □
Problem 5 (Resonance and Nyquist radius): Consider the second-order factor \( G_2(s)=\dfrac{\omega_n^2}{s^2+2\zeta\omega_n s+\omega_n^2} \). Show that if \( \zeta \) is small, then near \( \omega\approx\omega_n \) the Nyquist curve is far from the origin.
Solution: Evaluate the magnitude (Section 2.2):
\[ |G_2(j\omega)| = \frac{\omega_n^2}{\sqrt{(\omega_n^2-\omega^2)^2+(2\zeta\omega_n\omega)^2}}. \]
At \( \omega=\omega_n \), this reduces to \( |G_2(j\omega_n)|=\dfrac{\omega_n^2}{2\zeta\omega_n^2}=\dfrac{1}{2\zeta} \), which is large when \( \zeta \) is small. Since Nyquist radius equals \( r(\omega)=|G(j\omega)| \), the curve is far from the origin near resonance. □
7. Summary
Nyquist and Nichols plots are alternative parameterizations of the same frequency response \( G(j\omega) \). Nyquist visualizes complex-plane geometry (including the special role of the point \( -1 \) for unity feedback), while Nichols visualizes magnitude (dB) versus phase and provides an algebraic bridge to closed-loop magnitude through \( M^2=\dfrac{r^2}{1+r^2+2r\cos\phi} \). Resonance manifests as large \( |G(j\omega)| \), appearing as outward bulging in Nyquist and as peaks in Nichols magnitude.
8. References
- Nyquist, H. (1932). Regeneration theory. Bell System Technical Journal, 11(1), 126–147.
- Nichols, N.B. (1947). Graphical analysis of servo mechanisms. Transactions of the ASME, 69, 761–768.
- Black, H.S. (1934). Stabilized feedback amplifiers. Bell System Technical Journal, 13(1), 1–18.
- Bode, H.W. (1945). Network Analysis and Feedback Amplifier Design. D. Van Nostrand.
- MacFarlane, A.G.J. (1970). Return-difference and return-ratio matrices and their use in analysis and design of multivariable feedback control systems. Proceedings of the IEE, 117(10), 2037–2049.
- Rosenbrock, H.H. (1970). Design of multivariable control systems using the inverse Nyquist array. Proceedings of the IEE, 116(11), 1929–1936.
- Zames, G. (1966). On the input-output stability of time-varying nonlinear feedback systems—Part I. IEEE Transactions on Automatic Control, 11(2), 228–238.