Chapter 17: Stability Margins and Classical Robustness Measures

Lesson 5: Design Examples Focused on Margin Requirements

This lesson develops margin-based controller design workflows using concrete, fully worked examples. We translate numerical requirements on gain margin, phase margin, and delay margin into inequalities on the loop transfer function, and we carry out designs analytically and via software implementations (Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica), with emphasis on robot joint and actuator loops.

1. Margin-Based Design Overview

We consider a single-loop negative-feedback system with loop transfer function \( L(s) = C(s)G(s) \), where \( C(s) \) is the controller and \( G(s) \) is the plant (e.g., a robot joint or DC motor model). Given frequency-domain robustness requirements such as \( \varphi_m \geq \varphi_m^{\star} \) (phase margin) and \( G_m \geq G_m^{\star} \) (gain margin), our goal is to pick the controller parameters (often only a gain in this chapter) so that the resulting loop satisfies those inequalities.

Recall the standard definitions for a stable, strictly proper loop \( L(s) \):

\[ \begin{aligned} \omega_{\mathrm{gc}} &: \quad \lvert L(j\omega_{\mathrm{gc}})\rvert = 1, \\ \varphi_m &:= 180^{\circ} + \arg L(j\omega_{\mathrm{gc}}), \\ \omega_{\mathrm{pc}} &: \quad \arg L(j\omega_{\mathrm{pc}}) = -180^{\circ}, \\ G_m &:= \frac{1}{\lvert L(j\omega_{\mathrm{pc}})\rvert}, \qquad G_m^{\mathrm{dB}} := 20 \log_{10} G_m. \end{aligned} \]

In many robotic servo loops, design specifications are given as: “phase margin at least 45–60 degrees, gain margin at least 6–10 dB, and bandwidth (gain crossover) within a specified range.” The workflow is summarized below.

flowchart TD
  RQ["Start from specs: PM*, GM*, bandwidth"] --> P["Choose plant G(s) model (e.g. robot joint)"]
  P --> C["Select controller structure (here: proportional gain)"]
  C --> FREQ["Analyze |G(jw)| and arg G(jw)"]
  FREQ --> CHOICE["Choose target crossover w_c within allowable range"]
  CHOICE --> GAIN["Solve for gain K so that |K G(jw_c)| = 1"]
  GAIN --> CHECK["Compute PM, GM, delay margin"]
  CHECK --> OK["Specs satisfied?"]
  OK -->|yes| DONE["Finalize design and implement in code"]
  OK -->|no| ADJUST["Adjust w_c or controller structure"]
  ADJUST --> CHOICE
        

2. Inequalities Implied by Margin Requirements

Let the loop be \( L(s) = K G(s) \) with a scalar proportional gain \( K > 0 \). For a candidate crossover frequency \( \omega_c \), we must enforce the unity-gain condition

\[ \lvert L(j\omega_c)\rvert = 1 \quad \Longleftrightarrow \quad K = \frac{1}{\lvert G(j\omega_c)\rvert}. \]

At that frequency, the phase margin is

\[ \varphi_m(\omega_c) = 180^{\circ} + \arg G(j\omega_c), \]

since a real positive gain does not modify the phase. A requirement \( \varphi_m \geq \varphi_m^{\star} \) therefore becomes

\[ 180^{\circ} + \arg G(j\omega_c) \;\geq\; \varphi_m^{\star} \quad \Longleftrightarrow \quad \arg G(j\omega_c) \;\geq\; \varphi_m^{\star} - 180^{\circ}. \]

This inequality restricts the allowable range of \( \omega_c \); if the plant contributes too much phase lag at high frequencies, then a pure gain cannot satisfy a large phase margin at a high bandwidth.

For gain margin, if the phase-crossing frequency \( \omega_{\mathrm{pc}} \) exists (often it does not for strictly proper, minimum-phase plants without delay), the requirement \( G_m \geq G_m^{\star} \) is equivalent to

\[ G_m = \frac{1}{K\lvert G(j\omega_{\mathrm{pc}})\rvert} \;\geq\; G_m^{\star} \quad \Longleftrightarrow \quad K \;\leq\; \frac{1}{G_m^{\star} \lvert G(j\omega_{\mathrm{pc}})\rvert}. \]

Thus, phase-margin constraints give an upper bound on \( \omega_c \), whereas gain-margin constraints (when finite) give an upper bound on feasible gains \( K \).

A useful approximate formula links phase margin and delay margin. Suppose a pure time delay \( e^{-sT_d} \) is inserted in series with \( L(s) \). At the gain crossover, the delay contributes extra phase lag approximately \( -\omega_{\mathrm{gc}} T_d \) (in radians). The largest delay tolerated before loss of stability occurs when the available phase margin is exhausted:

\[ T_{d,\max} \approx \frac{\varphi_m \pi/180}{\omega_{\mathrm{gc}}}. \]

This relationship is central for networked and robotic systems with computation and communication latencies.

3. Example 1 — Proportional Design for a Normalized Position Servo

Consider a simplified robot joint position servo with plant

\[ G(s) = \frac{1}{s(s+1)}, \]

where time has been normalized so that the viscous damping coefficient and inertia appear in unity form. We design a proportional controller \( C(s) = K \) for unity negative feedback with specifications:

  • Phase margin: \( \varphi_m \geq 50^{\circ} \).
  • Bandwidth: \( \omega_{\mathrm{gc}} \) around \( 0.5 \)–\( 1 \,\mathrm{rad/s} \) (moderate speed).

3.1. Plant frequency response

Evaluate \( G(j\omega) \):

\[ G(j\omega) = \frac{1}{j\omega(1 + j\omega)}. \]

The magnitude and phase are

\[ \lvert G(j\omega)\rvert = \frac{1}{\omega\sqrt{1+\omega^2}}, \qquad \arg G(j\omega) = -90^{\circ} - \arctan(\omega). \]

For the proportional loop \( L(s) = K G(s) \), the phase at the crossover is exactly the plant phase. The phase margin as a function of frequency is therefore

\[ \varphi_m(\omega) = 180^{\circ} + \arg G(j\omega) = 90^{\circ} - \arctan(\omega). \]

3.2. Feasible crossover frequencies

The phase-margin requirement \( \varphi_m \geq 50^{\circ} \) becomes

\[ 90^{\circ} - \arctan(\omega_{\mathrm{gc}}) \;\geq\; 50^{\circ} \quad \Longleftrightarrow \quad \arctan(\omega_{\mathrm{gc}}) \;\leq\; 40^{\circ}. \]

Applying the tangent function:

\[ \omega_{\mathrm{gc}} \;\leq\; \tan(40^{\circ}) \approx 0.84. \]

Thus, if we insist on a proportional controller only, the crossover frequency cannot exceed approximately \( 0.84 \,\mathrm{rad/s} \) without violating the phase margin requirement. To stay comfortably within the admissible range and match the bandwidth preference, pick \( \omega_{\mathrm{gc}} = 0.7 \,\mathrm{rad/s} \).

3.3. Gain solving from unity-gain condition

At \( \omega_{\mathrm{gc}} = 0.7 \), the plant magnitude is

\[ \lvert G(j\omega_{\mathrm{gc}})\rvert = \frac{1}{\omega_{\mathrm{gc}}\sqrt{1+\omega_{\mathrm{gc}}^{2}}} = \frac{1}{0.7\sqrt{1+0.7^{2}}} \approx 1.17. \]

The unity-gain requirement \( \lvert L(j\omega_{\mathrm{gc}})\rvert = 1 \) gives

\[ K = \omega_{\mathrm{gc}}\sqrt{1+\omega_{\mathrm{gc}}^{2}} \approx 0.85. \]

The corresponding phase margin is

\[ \varphi_m = 90^{\circ} - \arctan(0.7) \approx 90^{\circ} - 35^{\circ} \approx 55^{\circ}, \]

which satisfies the requirement \( \varphi_m^{\star} = 50^{\circ} \) with some safety margin. The gain margin for this loop is infinite, because the phase asymptotically approaches \( -180^{\circ} \) only as \( \omega \to \infty \); there is no finite phase-crossing frequency \( \omega_{\mathrm{pc}} \).

3.4. Delay margin interpretation

Using the approximate delay-margin formula with \( \varphi_m \approx 55^{\circ} \) and \( \omega_{\mathrm{gc}} = 0.7 \,\mathrm{rad/s} \):

\[ T_{d,\max} \approx \frac{55 \cdot \pi / 180}{0.7} \approx 1.37 \,\mathrm{s}. \]

This says that the servo can tolerate roughly 1.3 seconds of additional pure delay before losing stability. In practice, we would demand a much smaller allowable delay (e.g., \( T_{d,\text{spec}} \approx 0.1 \)–\( 0.2 \,\mathrm{s} \)) and thus the current design is quite conservative from the delay-margin standpoint.

4. Example 2 — Including Explicit Delay in a Robot Joint Loop

Networked or embedded robotic controllers often exhibit a non-negligible delay due to sensor sampling, computation, and communication. Consider the same normalized plant as in Example 1, but now suppose the loop contains a known delay \( T_{d,0} \) in addition to any uncertainty. The loop transfer function becomes

\[ L(s) = K G(s) e^{-s T_{d,0}}. \]

At the gain crossover, the phase is reduced by \( \omega_{\mathrm{gc}} T_{d,0} \) radians compared with the delay-free loop. The phase margin of the delayed loop is therefore

\[ \varphi_m^{(d)} = \varphi_m^{(0)} - \omega_{\mathrm{gc}} T_{d,0} \cdot \frac{180}{\pi}, \]

where \( \varphi_m^{(0)} \) is the delay-free phase margin. Suppose we want a design requirement that even with the nominal delay, the closed loop retains at least \( 35^{\circ} \) phase margin:

\[ \varphi_m^{(d)} \geq 35^{\circ}. \]

Using the design of Example 1 with \( \varphi_m^{(0)} \approx 55^{\circ} \) and \( \omega_{\mathrm{gc}} = 0.7 \), this inequality becomes

\[ 55^{\circ} - \omega_{\mathrm{gc}} T_{d,0} \cdot \frac{180}{\pi} \;\geq\; 35^{\circ} \quad \Longleftrightarrow \quad T_{d,0} \;\leq\; \frac{20^{\circ} \cdot \pi / 180}{0.7} \approx 0.50 \,\mathrm{s}. \]

This calculation shows how an explicit delay bound follows from a desired post-delay phase margin. The corresponding block-level structure is:

flowchart TD
  R["r(t)"] --> SUM["e(t) = r(t) - y(t)"]
  SUM --> C["Controller K"]
  C --> D["Delay exp(-s T_d0)"]
  D --> P["Plant G(s) = 1/(s(s+1))"]
  P --> Y["y(t)"]
  Y -- "feedback" --> SUM
        

In robotics, \( T_{d,0} \) collects sensor sampling, computation, and communication latencies. The design inequalities above allow an engineer to decide whether a given sampling period and communication architecture are compatible with stability margin requirements.

5. Python Implementation (Robot Joint Example)

We now implement Example 1 in Python using the python-control library, which is widely used in academic and robotic control prototyping. The design steps are:

  1. Define the plant \( G(s) = 1/(s(s+1)) \).
  2. Choose \( \omega_{\mathrm{gc}} = 0.7 \) and compute \( K \) analytically.
  3. Form the closed loop and verify margins numerically.

import numpy as np
import control as ctl  # python-control library (common in robotics courses)

# 1. Define plant G(s) = 1 / (s (s + 1))
s = ctl.TransferFunction.s
G = 1 / (s * (s + 1))

# 2. Choose crossover frequency and compute K analytically
omega_gc = 0.7
# |G(j w)| = 1 / (w * sqrt(1 + w^2))
mag_G = 1.0 / (omega_gc * np.sqrt(1.0 + omega_gc**2))
K = 1.0 / mag_G  # unity gain at w = omega_gc

C = K  # proportional controller
L = C * G

# 3. Verify margins
gm, pm, w_gc_num, w_pc_num = ctl.margin(L)
print("Designed K =", K)
print("Numerical PM (deg) =", pm)
print("Numerical GM (abs) =", gm, "GM (dB) =", 20 * np.log10(gm))
print("Numerical w_gc =", w_gc_num)

# 4. Closed-loop response (for a step position command)
T_cl = ctl.feedback(L, 1)  # unity feedback

t = np.linspace(0, 20, 1000)
t_out, y_out = ctl.step_response(T_cl, T=t)

# (Plotting omitted here; in practice, use matplotlib to inspect step response.)

# 5. Robot-related remark:
# In a typical ROS-based robot joint controller, the plant G(s) would be obtained
# from the rigid-body dynamics and actuator model. The same margin-based design
# applies to each low-level joint loop before higher-level motion planning is added.
      

The same pattern extends to more complex robot actuators. Using libraries such as roboticstoolbox-python, one can derive joint models from kinematic and dynamic parameters and then apply margin-based loop shaping as above.

6. C++ and Java Implementation Sketches for Embedded Robotics

In embedded and robotic applications (e.g., ROS2 nodes or industrial servo drives), margin verification is often performed offline, while the real-time firmware only implements the final gain. However, it is useful to understand how to approximate margins numerically in C++ and Java.

6.1. C++: Bode Sampling and Phase Margin Approximation


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

// Eigen is a common linear algebra library in robotics C++ stacks.
#include <Eigen/Dense>

using std::complex;
using std::vector;

complex<double> Gplant(const complex<double>& s) {
    // G(s) = 1 / (s (s + 1))
    return 1.0 / (s * (s + 1.0));
}

int main() {
    // Target crossover frequency
    const double omega_gc = 0.7;

    // Compute |G(jw)| and K
    complex<double> jomega(0.0, omega_gc);
    complex<double> Gjw = Gplant(jomega);
    double magG = std::abs(Gjw);
    double K = 1.0 / magG;

    std::cout << "Designed K = " << K << std::endl;

    // Approximate PM numerically
    double phase_rad = std::arg(Gjw); // radians
    double pm_deg = 180.0 + phase_rad * 180.0 / M_PI;
    std::cout << "Approx PM (deg) = " << pm_deg << std::endl;

    // In a ROS2 controller, K would be used directly in the torque/voltage command:
    // u = K * (r - y);
    // where r is the desired joint angle and y is the measured angle.

    return 0;
}
      

6.2. Java: Loop Evaluation for a Robot Joint Controller Class


public class MarginDesignExample {

    // Complex number representation (minimal; for illustration only)
    static class C {
        double re, im;
        C(double r, double i) { re = r; im = i; }
        C add(C o) { return new C(re + o.re, im + o.im); }
        C mul(C o) { return new C(re * o.re - im * o.im, re * o.im + im * o.re); }
        C inv() {
            double d = re * re + im * im;
            return new C(re / d, -im / d);
        }
    }

    static C Gplant(C s) {
        // G(s) = 1 / (s (s + 1))
        C one = new C(1.0, 0.0);
        return (new C(1.0, 0.0)).mul(s.mul(s.add(one)).inv());
    }

    public static void main(String[] args) {
        double omegaGc = 0.7;
        C s = new C(0.0, omegaGc); // j * omega

        C Gjw = Gplant(s);
        double magG = Math.hypot(Gjw.re, Gjw.im);
        double K = 1.0 / magG;

        double phaseRad = Math.atan2(Gjw.im, Gjw.re);
        double pmDeg = 180.0 + phaseRad * 180.0 / Math.PI;

        System.out.println("Designed K = " + K);
        System.out.println("Approx PM (deg) = " + pmDeg);

        // In a robotics framework such as WPILib or custom Java control code,
        // this K would be used in the position servo: u = K * (r - y).
    }
}
      

These sketches show how the analytical design can be mirrored by numerical margin computations even in low-level languages used in robotic systems.

7. MATLAB/Simulink and Wolfram Mathematica Implementations

7.1. MATLAB/Simulink (Using Control System Toolbox)


% Plant: G(s) = 1 / (s (s + 1))
s = tf('s');
G = 1 / (s * (s + 1));

% Desired crossover
omega_gc = 0.7;
magG = abs(freqresp(G, omega_gc));  % |G(j w)|
K = 1 / magG;
C = K;

L = C * G;

[gm, pm, wgc_num, wpc_num] = margin(L);
fprintf('Designed K = %.4f\n', K);
fprintf('Phase margin = %.2f deg at w = %.3f rad/s\n', pm, wgc_num);

Tcl = feedback(L, 1);
step(Tcl);
grid on;
title('Closed-loop step response, proportional design');

% Simulink note:
% In Simulink, one would implement:
%   - A "Gain" block with value K,
%   - A Transfer Fcn block for 1 / (s (s + 1)),
%   - A Sum block for feedback.
% Then use the Linear Analysis Tool to confirm margins.
      

7.2. Wolfram Mathematica


(* Define Laplace variable and transfer function *)
s =. ;
Clear[s];
G[s_] := 1/(s (s + 1));

(* Magnitude and phase of G(j w) *)
magG[w_] := Abs[G[I w]];
phaseG[w_] := Arg[G[I w]]; (* radians *)

omegaGc = 0.7;
magVal = magG[omegaGc];
K = 1/magVal;

Print["Designed K = ", K];

pmDeg = 180 + phaseG[omegaGc] * 180/Pi;
Print["Approx phase margin (deg) = ", pmDeg];

(* Bode-like plots *)
wRange = {0.1, 10};
LogLinearPlot[{20 Log10[Abs[K G[I w]]]}, {w, wRange[[1]], wRange[[2]]},
  PlotRange -> All,
  AxesLabel -> {"w (rad/s)", "Magnitude (dB)"},
  PlotLabel -> "Loop magnitude with proportional gain"];

ParametricPlot[
  {Re[K G[I w]], Im[K G[I w]]},
  {w, wRange[[1]], wRange[[2]]},
  PlotLabel -> "Nyquist curve of L(s) = K G(s)",
  AxesLabel -> {"Re", "Im"}
]
      

Mathematica supports symbolic and numeric frequency-response analysis, allowing verification of analytic formulas (e.g., \( \lvert G(j\omega)\rvert = 1 / (\omega\sqrt{1+\omega^2}) \)) and exploration of alternate controller structures that will appear in later chapters (lead, lag, and more).

8. Problems and Solutions

Problem 1 (Analytic Phase Margin for Proportional Gain): For the plant \( G(s) = 1/(s(s+1)) \) and proportional controller \( C(s) = K \), derive the phase margin \( \varphi_m \) as a function of the crossover frequency \( \omega_{\mathrm{gc}} \).

Solution:

The loop is \( L(s) = K G(s) \). At frequency \( \omega \),

\[ G(j\omega) = \frac{1}{j\omega (1 + j\omega)}. \]

The factors contribute phases \( -90^{\circ} \) from \( 1/(j\omega) \) and \( -\arctan(\omega) \) from \( 1/(1 + j\omega) \), so

\[ \arg G(j\omega) = -90^{\circ} - \arctan(\omega). \]

At crossover \( \omega_{\mathrm{gc}} \), the phase margin is

\[ \varphi_m(\omega_{\mathrm{gc}}) = 180^{\circ} + \arg G(j\omega_{\mathrm{gc}}) = 90^{\circ} - \arctan(\omega_{\mathrm{gc}}). \]

This matches the expression used in Example 1.

Problem 2 (Feasible Crossover Range): For the same plant as in Problem 1, suppose a phase margin requirement \( \varphi_m \geq 60^{\circ} \) is imposed. Determine the allowable range of crossover frequencies \( \omega_{\mathrm{gc}} \).

Solution:

Using \( \varphi_m(\omega) = 90^{\circ} - \arctan(\omega) \) we require

\[ 90^{\circ} - \arctan(\omega_{\mathrm{gc}}) \;\geq\; 60^{\circ} \quad \Longleftrightarrow \quad \arctan(\omega_{\mathrm{gc}}) \;\leq\; 30^{\circ}. \]

Hence \( \omega_{\mathrm{gc}} \leq \tan(30^{\circ}) = 1/\sqrt{3} \approx 0.577 \). Any choice of crossover frequency \( \omega_{\mathrm{gc}} \) less than or equal to this value can achieve \( \varphi_m \geq 60^{\circ} \) with a suitable gain \( K = 1 / \lvert G(j\omega_{\mathrm{gc}})\rvert \).

Problem 3 (Delay Margin from Phase Margin): A loop has phase margin \( \varphi_m = 45^{\circ} \) and gain crossover frequency \( \omega_{\mathrm{gc}} = 4 \,\mathrm{rad/s} \). Compute the approximate maximum additional delay \( T_{d,\max} \) that can be inserted while maintaining stability.

Solution:

Using \( T_{d,\max} \approx (\varphi_m \pi/180)/\omega_{\mathrm{gc}} \),

\[ T_{d,\max} \approx \frac{45^{\circ} \cdot \pi / 180}{4} = \frac{\pi/4}{4} = \frac{\pi}{16} \approx 0.196 \,\mathrm{s}. \]

The loop can tolerate about 0.2 seconds of additional delay before losing stability.

Problem 4 (Gain Margin and Gain Uncertainty): Suppose a loop has a gain margin \( G_m = 3 \) (approximately \( 9.5 \,\mathrm{dB} \)). The true plant gain is uncertain and may vary by a multiplicative factor \( \alpha \) around the nominal, i.e., actual loop is \( \alpha L_{\text{nom}}(s) \). Assuming the only uncertainty is this scalar gain factor, derive the range of \( \alpha \) for which the loop is guaranteed stable.

Solution:

By definition, \( G_m = 3 \) means the loop remains stable as the gain is increased up to a factor of 3 above nominal. Negative gain variations are bounded by the reciprocal: the loop is also stable as long as the gain is decreased down to \( 1/3 \) of nominal, assuming no other destabilizing effects. Thus, the loop is guaranteed stable for

\[ \frac{1}{3} \leq \alpha \leq 3. \]

This classical interpretation directly connects gain margin to robustness against pure multiplicative gain uncertainty.

Problem 5 (Bandwidth vs. Phase Margin Trade-Off): For the plant \( G(s) = 1/(s(s+1)) \) with proportional control, argue why requesting both a very high bandwidth \( \omega_{\mathrm{gc}} \geq 2 \,\mathrm{rad/s} \) and a very large phase margin \( \varphi_m \geq 60^{\circ} \) is impossible without modifying the controller structure beyond a simple gain.

Solution:

As in earlier problems, \( \varphi_m(\omega) = 90^{\circ} - \arctan(\omega) \). For \( \omega_{\mathrm{gc}} = 2 \,\mathrm{rad/s} \),

\[ \varphi_m(2) = 90^{\circ} - \arctan(2) \approx 90^{\circ} - 63.4^{\circ} \approx 26.6^{\circ}, \]

which is much smaller than \( 60^{\circ} \). Increasing the gain \( K \) to push the crossover further right only reduces the phase margin, because the plant contributes additional phase lag at higher frequencies. For a pure gain controller, the phase curve of \( G(s) \) is fixed; we can only change where the magnitude crosses 0 dB. Therefore, the pair of specifications \( (\omega_{\mathrm{gc}} \geq 2,\; \varphi_m \geq 60^{\circ}) \) cannot be met simultaneously. Achieving such goals requires altering the loop shape with additional dynamics (e.g., lead compensation), which is studied in later chapters.

9. Summary

In this lesson we translated numerical gain margin, phase margin, and delay margin specifications into analytic constraints on the loop transfer function. For a normalized second-order plant representing a robot joint position servo, we:

  • Derived explicit formulas for phase margin as a function of crossover frequency.
  • Computed proportional gains that meet given phase-margin and bandwidth requirements.
  • Related phase margin to delay margin, enabling reasoning about allowable sensor and computation delays.
  • Implemented and verified the designs in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica, with remarks on their role in robotic control stacks.

These examples illustrate the classical “shape the loop to meet margin specs” philosophy that underlies more advanced compensator designs, which will be developed in detail in subsequent chapters.

10. References

  1. Bode, H. W. (1945). Network Analysis and Feedback Amplifier Design. Van Nostrand.
  2. Nyquist, H. (1932). Regeneration theory. Bell System Technical Journal, 11(1), 126–147.
  3. MacColl, L. A. (1945). Fundamental theory of servomechanisms. Bell System Technical Journal, 24(3), 585–635.
  4. Horowitz, I. M. (1963). Synthesis of feedback systems. Academic Press.
  5. Zames, G. (1966). On the input–output stability of time-varying nonlinear feedback systems. Part I: Conditions derived using concepts of loop gain, conicity, and positivity. IEEE Transactions on Automatic Control, 11(2), 228–238.
  6. Doyle, J. C. (1982). Analysis of feedback systems with structured uncertainties. IEE Proceedings, Part D, 129(6), 242–250.
  7. Middleton, R. H., & Goodwin, G. C. (1988). Improved finite word length characteristics in digital control using delta operators. IEEE Transactions on Automatic Control, 33(1), 97–100.
  8. Åström, K. J., & Hägglund, T. (1984). Automatic tuning of simple regulators with specifications on phase and amplitude margins. Automatica, 20(5), 645–651.
  9. Middleton, R. H., & Goodwin, G. C. (1990). Digital control and filtering using deadbeat observers. Automatica, 26(1), 149–152.
  10. Stein, G. (2003). Respect the unstable. IEEE Control Systems Magazine, 23(4), 12–25.