Chapter 25: Limitations of State-Feedback Design

Lesson 2: Role of Transmission Zeros in Design Limits

This lesson explains why state-feedback pole placement, although powerful for relocating controllable modes, cannot remove the input-output restrictions imposed by transmission zeros. We prove the invariance of transmission zeros under static state feedback, connect right-half-plane zeros to non-minimum-phase behavior, and show how zeros limit tracking, disturbance rejection, decoupling, and bandwidth.

1. Conceptual Position of Zeros in State-Feedback Design

In the previous lesson, we saw that uncontrollable modes cannot be assigned by state feedback. Transmission zeros create a different kind of limitation: even when the pair \( (A,B) \) is controllable and the closed-loop poles can be placed almost freely, the input-output map may still contain directions, frequencies, or exponential signals that cannot be transmitted to the output.

For a continuous-time LTI system \( \dot{x}=Ax+Bu \), \( y=Cx+Du \), the Rosenbrock system matrix is

\[ \mathcal{P}(s)= \begin{bmatrix} sI-A & -B \\ C & D \end{bmatrix}. \]

A complex number \( z \) is a finite transmission zero when the system matrix loses normal rank:

\[ \operatorname{rank}\mathcal{P}(z)< \operatorname{normalrank}\mathcal{P}(s). \]

Equivalently, there exist nonzero vectors \( x_z \) and \( u_z \) satisfying

\[ \begin{bmatrix} zI-A & -B \\ C & D \end{bmatrix} \begin{bmatrix} x_z \\ u_z \end{bmatrix}=0. \]

Thus the state and input can evolve like \( x(t)=x_z e^{zt} \), \( u(t)=u_z e^{zt} \), while the output remains zero. This is why zeros are often interpreted as output-blocking modes.

flowchart TD
  A["State feedback: u = -Kx + v"] --> B["Closed-loop poles can move if (A,B) is controllable"]
  B --> C["Transmission zeros remain fixed"]
  C --> D["RHP zeros cause \nnon-minimum-phase response"]
  C --> E["Zeros at command/disturbance \nfrequencies block exact regulation"]
  C --> F["MIMO zero directions \nrestrict decoupling"]
  D --> G["Design limits: bandwidth, undershoot, sensitivity"]
  E --> G
  F --> G
        

2. Transfer-Matrix View and Zero Directions

The transfer matrix is \( G(s)=C(sI-A)^{-1}B+D \). In a SISO minimal realization, transmission zeros coincide with the roots of the numerator of \( G(s) \). In MIMO systems, zeros are not merely roots of one scalar numerator. They correspond to a loss of rank in the matrix-valued input-output map.

For a square transfer matrix with full normal rank and \( D=0 \), finite zeros may be detected through

\[ \det G(z)=0, \quad \operatorname{rank}G(z)<m. \]

However, the Rosenbrock definition is more general because it also works for nonsquare systems, nonzero \( D \), and state-space realizations where direct determinant arguments are inconvenient.

If \( G(z)r_z=0 \) for a nonzero input direction \( r_z \), then the input direction \( r_z \) is blocked at the complex frequency \( z \). In MIMO design this directionality matters: a zero may limit one output combination strongly while leaving another output combination less affected.

3. Invariance of Transmission Zeros Under Static State Feedback

Apply static state feedback with a new external input \( v \):

\[ u=-Kx+v. \]

The closed-loop input-output realization from \( v \) to \( y \) is

\[ \dot{x}=(A-BK)x+Bv, \qquad y=(C-DK)x+Dv. \]

Its Rosenbrock matrix is

\[ \mathcal{P}_K(s)= \begin{bmatrix} sI-A+BK & -B \\ C-DK & D \end{bmatrix}. \]

Now factor this matrix using an invertible block matrix:

\[ \mathcal{P}_K(s)= \begin{bmatrix} sI-A & -B \\ C & D \end{bmatrix} \begin{bmatrix} I & 0 \\ -K & I \end{bmatrix} =\mathcal{P}(s) \begin{bmatrix} I & 0 \\ -K & I \end{bmatrix}. \]

Since \( \begin{bmatrix} I&0\\-K&I \end{bmatrix} \) is nonsingular for every finite \( K \), multiplication by it cannot change rank. Therefore

\[ \operatorname{rank}\mathcal{P}_K(s)= \operatorname{rank}\mathcal{P}(s), \quad \forall s\in\mathbb{C}. \]

Consequently, static state feedback does not move finite transmission zeros. It can relocate controllable poles, but it cannot remove the rank-loss frequencies of the original input-output channel.

\[ z\in\mathcal{Z}(A,B,C,D) \quad\Longleftrightarrow\quad z\in\mathcal{Z}(A-BK,B,C-DK,D). \]

4. Why Right-Half-Plane Zeros Are Severe Design Limits

A zero \( z \) with \( \operatorname{Re}(z)>0 \) is a right-half-plane zero. Such a zero is non-minimum-phase because its cancellation would require an unstable pole in the controller or prefilter. Hence the zero cannot be removed by stable compensation.

For SISO systems, suppose

\[ G(s)=\frac{N(s)}{D(s)}, \qquad N(z)=0,\quad \operatorname{Re}(z)>0. \]

If a prefilter \( F(s) \) attempts to cancel the zero, then \( F(s) \) must contain a factor \( (s-z)^{-1} \). This factor is unstable because \( z \) lies in the open right half-plane. Therefore a stable design cannot exactly cancel this zero.

The practical consequence is inverse response: the initial movement of the output may occur in the direction opposite to the final commanded value. Faster pole placement can make the closed-loop denominator faster, but the numerator zero still imposes the same non-minimum-phase geometry.

\[ \text{fast poles} \not\Longrightarrow \text{arbitrarily fast tracking when RHP zeros exist}. \]

5. Tracking and Disturbance-Rejection Rank Conditions

Consider constant-reference tracking using \( u=-Kx+Nr \). At steady state, with \( \dot{x}=0 \), we require

\[ 0=(A-BK)x_{ss}+BNr, \qquad r=(C-DK)x_{ss}+DNr. \]

This is a solvability problem involving the closed-loop Rosenbrock matrix at \( s=0 \):

\[ \begin{bmatrix} -A+BK & -B \\ C-DK & D \end{bmatrix} \begin{bmatrix} x_{ss} \\ Nr \end{bmatrix} = \begin{bmatrix} 0 \\ r \end{bmatrix}. \]

By the rank invariance proved above, a zero at \( s=0 \) cannot be repaired by choosing \( K \). More generally, for exponential commands or disturbances with generator eigenvalue \( \lambda \), exact regulation requires that the plant not block that frequency:

\[ \operatorname{rank} \begin{bmatrix} \lambda I-A & -B \\ C & D \end{bmatrix} =n+p. \]

If this rank condition fails at a required command or disturbance frequency, state feedback alone cannot create exact tracking or exact disturbance rejection at that frequency.

6. MIMO Decoupling and Zero Directions

In MIMO systems, zeros are associated with directions. Let \( z \) be a zero and suppose there exists a nonzero vector \( r_z \) such that \( G(z)r_z=0 \). Then no controller can make the plant transmit that input direction at \( z \) without unstable cancellation.

This directly limits decoupling. A desired diagonal closed-loop transfer matrix \( T_d(s)=\operatorname{diag}(T_1(s),\dots,T_p(s)) \) may be algebraically assignable only if its implied zeros and poles are compatible with the invariant zero structure of the original plant. Otherwise, exact decoupling forces hidden unstable dynamics or nonproper/unstable compensators.

\[ \text{zero directions}+ \text{rank loss}+ \text{stable realizability} \quad\Longrightarrow\quad \text{MIMO design limits}. \]

7. Worked Example — Fast Poles, Fixed Zero

Consider the controllable realization

\[ A=\begin{bmatrix}0&1\\-2&-3\end{bmatrix},\quad B=\begin{bmatrix}0\\1\end{bmatrix},\quad C=\begin{bmatrix}1&-1\end{bmatrix},\quad D=0. \]

Since \( (sI-A)^{-1}B= \frac{1}{s^2+3s+2}\begin{bmatrix}1\\s\end{bmatrix} \), the transfer function is

\[ G(s)=C(sI-A)^{-1}B =\frac{1-s}{s^2+3s+2}. \]

The open-loop poles are \( -1 \) and \( -2 \), while the zero is \( z=+1 \). Place closed-loop poles at \( -5 \) and \( -6 \). With \( u=-Kx+v \), companion-form coefficient matching gives

\[ K=\begin{bmatrix}28&8\end{bmatrix},\qquad A-BK=\begin{bmatrix}0&1\\-30&-11\end{bmatrix}. \]

The closed-loop transfer from \( v \) to \( y \) becomes

\[ G_K(s)=C(sI-A+BK)^{-1}B =\frac{1-s}{s^2+11s+30}. \]

The poles moved from \( \{-1,-2\} \) to \( \{-5,-6\} \), but the zero \( +1 \) did not move. This example captures the central message of the lesson.

8. Software Implementations

The following implementations compute the same example and verify that the state-feedback gain relocates poles while leaving the transmission zero unchanged.

Chapter25_Lesson2.py

# Chapter25_Lesson2.py
# Role of transmission zeros in state-feedback design limits.
#
# Required libraries:
#   pip install numpy scipy
#
# This script uses a SISO plant with a right-half-plane transmission zero:
#       G(s) = (1 - s)/(s^2 + 3s + 2)
# and shows that static state feedback can move poles but does not move
# the plant transmission zero.

import numpy as np
from scipy.signal import ss2tf

np.set_printoptions(precision=6, suppress=True)


def siso_zero_pole_data(A, B, C, D):
    """Return numerator, denominator, zeros, and poles for a SISO state model."""
    numerator, denominator = ss2tf(A, B, C, D)
    numerator = np.trim_zeros(numerator[0], "f")
    denominator = np.trim_zeros(denominator, "f")
    zeros = np.roots(numerator) if len(numerator) > 1 else np.array([])
    poles = np.roots(denominator)
    return numerator, denominator, zeros, poles


def rosenbrock_matrix(s, A, B, C, D):
    """Rosenbrock system matrix P(s) = [[sI-A, -B], [C, D]]."""
    n = A.shape[0]
    upper = np.hstack((s * np.eye(n) - A, -B))
    lower = np.hstack((C, D))
    return np.vstack((upper, lower))


def numerical_rank(M, tol=1e-9):
    """Numerical rank from singular values."""
    sigma = np.linalg.svd(M, compute_uv=False)
    return int(np.sum(sigma > tol)), sigma


# Plant realization:
# A = [[0, 1], [-2, -3]], B = [[0], [1]], C = [[1, -1]], D = [[0]]
# gives G(s) = (1 - s)/(s^2 + 3s + 2).
A = np.array([[0.0, 1.0],
              [-2.0, -3.0]])
B = np.array([[0.0],
              [1.0]])
C = np.array([[1.0, -1.0]])
D = np.array([[0.0]])

num, den, zeros_open, poles_open = siso_zero_pole_data(A, B, C, D)

print("Open-loop numerator coefficients:", num)
print("Open-loop denominator coefficients:", den)
print("Open-loop zeros:", zeros_open)
print("Open-loop poles:", poles_open)

# Place closed-loop poles at -5 and -6 by direct companion-form matching.
# Open denominator: s^2 + 3s + 2
# Desired denominator: (s+5)(s+6) = s^2 + 11s + 30
K = np.array([[30.0 - 2.0, 11.0 - 3.0]])  # [28, 8]
Acl = A - B @ K

num_cl, den_cl, zeros_cl, poles_cl = siso_zero_pole_data(Acl, B, C, D)

print("\nState-feedback gain K:", K)
print("Closed-loop numerator coefficients:", num_cl)
print("Closed-loop denominator coefficients:", den_cl)
print("Closed-loop zeros:", zeros_cl)
print("Closed-loop poles:", poles_cl)

# Rosenbrock rank test at the known zero z = +1.
z = 1.0
Pz = rosenbrock_matrix(z, A, B, C, D)
rank_z, sv_z = numerical_rank(Pz)

PKz = rosenbrock_matrix(z, Acl, B, C, D)
rank_cl_z, sv_cl_z = numerical_rank(PKz)

print("\nRosenbrock matrix at s = +1")
print("Open-loop rank:", rank_z, "singular values:", sv_z)
print("Closed-loop rank:", rank_cl_z, "singular values:", sv_cl_z)

# Test at a nonzero point, e.g., s = 0.
s0 = 0.0
rank_0, sv_0 = numerical_rank(rosenbrock_matrix(s0, A, B, C, D))
print("\nRosenbrock matrix at s = 0")
print("Rank:", rank_0, "singular values:", sv_0)

# Frequency-domain interpolation fact:
# If G(z)=0, then for any finite stabilizing controller based on that input-output channel,
# L(z)=G(z)C(z)=0, hence S(z)=1 and T(z)=0.
print("\nDesign-limit interpretation:")
print("The RHP zero at s=+1 remains after state feedback.")
print("Fast pole placement is possible, but stable tracking cannot cancel this zero.")
print("A stable prefilter cannot remove the inverse-response limitation caused by the RHP zero.")

Chapter25_Lesson2.cpp

// Chapter25_Lesson2.cpp
// Role of transmission zeros in state-feedback design limits.
//
// Compile:
//   g++ -std=c++17 Chapter25_Lesson2.cpp -o Chapter25_Lesson2
//
// This file uses no external control library. It demonstrates the canonical
// SISO plant G(s) = (1 - s)/(s^2 + 3s + 2). State feedback moves the
// denominator to s^2 + 11s + 30, but the numerator 1 - s is unchanged.

#include <cmath>
#include <iostream>
#include <iomanip>
#include <complex>
#include <array>

struct QuadraticRoots {
    std::complex<double> r1;
    std::complex<double> r2;
};

QuadraticRoots roots_of_quadratic(double a, double b, double c) {
    std::complex<double> disc = std::complex<double>(b * b - 4.0 * a * c, 0.0);
    std::complex<double> sqrt_disc = std::sqrt(disc);
    return {(-b + sqrt_disc) / (2.0 * a), (-b - sqrt_disc) / (2.0 * a)};
}

int main() {
    std::cout << std::fixed << std::setprecision(6);

    // Open-loop denominator: s^2 + 3s + 2.
    double open_a1 = 3.0;
    double open_a0 = 2.0;

    // Numerator: 1 - s = -s + 1.
    double num_s = -1.0;
    double num_0 = 1.0;
    double zero = -num_0 / num_s;

    auto open_poles = roots_of_quadratic(1.0, open_a1, open_a0);

    std::cout << "Open-loop G(s) = (1 - s)/(s^2 + 3s + 2)\n";
    std::cout << "Transmission zero: " << zero << "\n";
    std::cout << "Open-loop poles: " << open_poles.r1 << ", " << open_poles.r2 << "\n\n";

    // State feedback u = -Kx + v.
    // A = [[0,1],[-2,-3]], B = [[0],[1]]
    // A - BK = [[0,1],[-2-k1,-3-k2]]
    // Desired denominator: (s+5)(s+6) = s^2 + 11s + 30.
    double desired_a1 = 11.0;
    double desired_a0 = 30.0;
    double k1 = desired_a0 - open_a0;
    double k2 = desired_a1 - open_a1;

    auto closed_poles = roots_of_quadratic(1.0, desired_a1, desired_a0);

    std::cout << "State-feedback gain K = [" << k1 << ", " << k2 << "]\n";
    std::cout << "Closed-loop denominator: s^2 + " << desired_a1 << "s + " << desired_a0 << "\n";
    std::cout << "Closed-loop poles: " << closed_poles.r1 << ", " << closed_poles.r2 << "\n";
    std::cout << "Closed-loop numerator remains: 1 - s\n";
    std::cout << "Closed-loop transmission zero remains: " << zero << "\n\n";

    double numerator_at_zero = 1.0 - zero;
    std::cout << "Numerator evaluated at s = +1: " << numerator_at_zero << "\n";
    std::cout << "Conclusion: pole assignment changes modes, not transmission zeros.\n";
    std::cout << "A right-half-plane zero imposes tracking and bandwidth limits even after fast pole placement.\n";

    return 0;
}

Chapter25_Lesson2.java

// Chapter25_Lesson2.java
// Role of transmission zeros in state-feedback design limits.
//
// Compile and run:
//   javac Chapter25_Lesson2.java
//   java Chapter25_Lesson2
//
// This file demonstrates the SISO plant
//       G(s) = (1 - s)/(s^2 + 3s + 2)
// and shows that state feedback changes closed-loop poles but not the
// transmission zero at s = +1.

public class Chapter25_Lesson2 {
    static class Complex {
        final double re;
        final double im;

        Complex(double re, double im) {
            this.re = re;
            this.im = im;
        }

        @Override
        public String toString() {
            if (Math.abs(im) < 1e-12) {
                return String.format("%.6f", re);
            }
            return String.format("%.6f%+.6fi", re, im);
        }
    }

    static Complex[] rootsOfQuadratic(double a, double b, double c) {
        double disc = b * b - 4.0 * a * c;
        if (disc >= 0.0) {
            double sqrtDisc = Math.sqrt(disc);
            return new Complex[] {
                new Complex((-b + sqrtDisc) / (2.0 * a), 0.0),
                new Complex((-b - sqrtDisc) / (2.0 * a), 0.0)
            };
        }

        double sqrtDisc = Math.sqrt(-disc);
        return new Complex[] {
            new Complex(-b / (2.0 * a), sqrtDisc / (2.0 * a)),
            new Complex(-b / (2.0 * a), -sqrtDisc / (2.0 * a))
        };
    }

    public static void main(String[] args) {
        double openA1 = 3.0;
        double openA0 = 2.0;

        // Numerator 1 - s = -s + 1.
        double numS = -1.0;
        double num0 = 1.0;
        double zero = -num0 / numS;

        Complex[] openPoles = rootsOfQuadratic(1.0, openA1, openA0);

        System.out.println("Open-loop G(s) = (1 - s)/(s^2 + 3s + 2)");
        System.out.println("Transmission zero: " + String.format("%.6f", zero));
        System.out.println("Open-loop poles: " + openPoles[0] + ", " + openPoles[1]);
        System.out.println();

        // Desired closed-loop poles: -5 and -6.
        double desiredA1 = 11.0;
        double desiredA0 = 30.0;
        double k1 = desiredA0 - openA0;
        double k2 = desiredA1 - openA1;

        Complex[] closedPoles = rootsOfQuadratic(1.0, desiredA1, desiredA0);

        System.out.println("State-feedback gain K = [" + k1 + ", " + k2 + "]");
        System.out.println("Closed-loop denominator: s^2 + " + desiredA1 + "s + " + desiredA0);
        System.out.println("Closed-loop poles: " + closedPoles[0] + ", " + closedPoles[1]);
        System.out.println("Closed-loop numerator remains: 1 - s");
        System.out.println("Closed-loop transmission zero remains: " + String.format("%.6f", zero));
        System.out.println();

        double numeratorAtZero = 1.0 - zero;
        System.out.println("Numerator evaluated at s = +1: " + String.format("%.6f", numeratorAtZero));
        System.out.println("Conclusion: pole assignment changes modes, not transmission zeros.");
        System.out.println("A right-half-plane zero imposes tracking and bandwidth limits even after fast pole placement.");
    }
}

Chapter25_Lesson2.m

% Chapter25_Lesson2.m
% Role of transmission zeros in state-feedback design limits.
%
% Required toolbox:
%   Control System Toolbox
%
% This script uses
%       G(s) = (1 - s)/(s^2 + 3s + 2)
% and demonstrates that static state feedback moves closed-loop poles but
% leaves the transmission zero fixed.

clear; clc; close all;

A = [0 1; -2 -3];
B = [0; 1];
C = [1 -1];
D = 0;

sys = ss(A, B, C, D);

disp('Open-loop transfer function:');
G = tf(sys)

disp('Open-loop transmission zeros:');
z_open = tzero(sys)

disp('Open-loop poles:');
p_open = pole(sys)

% Place closed-loop poles at -5 and -6.
desired_poles = [-5 -6];
K = place(A, B, desired_poles);
Acl = A - B*K;
sys_cl = ss(Acl, B, C, D);

disp('State-feedback gain K:');
disp(K);

disp('Closed-loop transfer function from v to y:');
Gcl = tf(sys_cl)

disp('Closed-loop transmission zeros:');
z_closed = tzero(sys_cl)

disp('Closed-loop poles:');
p_closed = pole(sys_cl)

% Rosenbrock rank test at s = +1.
s = 1;
P = [s*eye(size(A)) - A, -B; C, D];
Pcl = [s*eye(size(Acl)) - Acl, -B; C, D];

disp('Rank of Rosenbrock matrix at s = +1:');
disp(rank(P));
disp('Rank of closed-loop Rosenbrock matrix at s = +1:');
disp(rank(Pcl));

% Compare step responses. The RHP zero causes inverse-response behavior
% that is not removed by state feedback.
figure;
step(sys, sys_cl);
grid on;
legend('open-loop input-to-output', 'closed-loop v-to-output', 'Location', 'best');
title('Transmission zero remains fixed under state feedback');

% Simulink implementation note:
% 1. Add a State-Space block for (A,B,C,D).
% 2. Add a Gain block K in feedback from x to u if states are exposed.
% 3. Use u = -Kx + v.
% 4. Compare the Transfer Function/Linear Analysis zeros before and after K.
% The poles change, but the zero at s = +1 remains.

Chapter25_Lesson2.nb

Notebook[{
Cell["Chapter25_Lesson2.nb", "Title"],
Cell["Role of Transmission Zeros in State-Feedback Design Limits", "Subtitle"],
Cell["This notebook uses G(s) = (1 - s)/(s^2 + 3 s + 2). It verifies symbolically that state feedback changes the closed-loop denominator while preserving the transmission zero.", "Text"],

Cell[BoxData[
 RowBox[{
  RowBox[{"ClearAll", "[", "s", "]"}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{
  RowBox[{"G", "=", 
   FractionBox[
    RowBox[{"1", "-", "s"}], 
    RowBox[{
     SuperscriptBox["s", "2"], "+", 
     RowBox[{"3", " ", "s"}], "+", "2"}]]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"{", 
  RowBox[{
   RowBox[{"Numerator", "[", "G", "]"}], ",", 
   RowBox[{"Denominator", "[", "G", "]"}], ",", 
   RowBox[{"Solve", "[", 
    RowBox[{
     RowBox[{
      RowBox[{"Numerator", "[", "G", "]"}], "==", "0"}], ",", "s"}], 
    "]"}]}], "}"}]], "Input"],

Cell["For A = { {0,1},{-2,-3} }, B = { {0},{1} }, C = { {1,-1} }, D = 0, the transfer function is C (sI - A)^(-1) B.", "Text"],

Cell[BoxData[
 RowBox[{
  RowBox[{"A", "=", 
   RowBox[{"(", GridBox[{ {"0", "1"}, {"-2", "-3"} }], ")"}]}], ";", 
  RowBox[{"B", "=", 
   RowBox[{"(", GridBox[{ {"0"}, {"1"} }], ")"}]}], ";", 
  RowBox[{"Cmat", "=", 
   RowBox[{"(", GridBox[{ {"1", "-1"} }], ")"}]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"FullSimplify", "[", 
  RowBox[{"Cmat", ".", 
   RowBox[{"Inverse", "[", 
    RowBox[{
     RowBox[{"s", " ", 
      RowBox[{"IdentityMatrix", "[", "2", "]"}]}], "-", "A"}], "]"}], ".", "B"}],
  "]"}]], "Input"],

Cell["Choose K = {28, 8}, which gives closed-loop poles -5 and -6.", "Text"],

Cell[BoxData[
 RowBox[{
  RowBox[{"K", "=", 
   RowBox[{"(", GridBox[{ {"28", "8"} }], ")"}]}], ";", 
  RowBox[{"Acl", "=", 
   RowBox[{"A", "-", 
    RowBox[{"B", ".", "K"}]}]}], ";"}]], "Input"],

Cell[BoxData[
 RowBox[{"FullSimplify", "[", 
  RowBox[{"Cmat", ".", 
   RowBox[{"Inverse", "[", 
    RowBox[{
     RowBox[{"s", " ", 
      RowBox[{"IdentityMatrix", "[", "2", "]"}]}], "-", "Acl"}], "]"}], ".", "B"}],
  "]"}]], "Input"],

Cell[BoxData[
 RowBox[{"{", 
  RowBox[{
   RowBox[{"Eigenvalues", "[", "A", "]"}], ",", 
   RowBox[{"Eigenvalues", "[", "Acl", "]"}]}], "}"}]], "Input"],

Cell["The numerator remains 1 - s; therefore the transmission zero remains s = +1. This is the algebraic reason why state feedback cannot remove the non-minimum-phase limitation.", "Text"]
}]

9. Design Checklist for Zero-Constrained State Feedback

Before selecting aggressive pole locations, inspect the zero structure. A closed-loop design that ignores zeros may appear acceptable in eigenvalue calculations but fail in tracking, actuator effort, or robustness.

flowchart TD
  S["Start with (A,B,C,D)"] --> Z["Compute transmission zeros"]
  Z --> R["Any zero in right half plane?"]
  R -->|yes| L1["Avoid unstable cancellation; \nlimit bandwidth"]
  R -->|no| O["Any zero at \ncommand/disturbance frequency?"]
  O -->|yes| L2["Exact regulation blocked \nat that frequency"]
  O -->|no| M["For MIMO: \ninspect zero directions"]
  M --> D["Check decoupling and \ntracking compatibility"]
  L1 --> P["Choose poles with realistic \nspeed and effort"]
  L2 --> P
  D --> P
  P --> V["Validate time response, control effort, sensitivity"]
        

10. Problems and Solutions

Problem 1 (Rank Definition of a Zero): Let \( \mathcal{P}(s)= \begin{bmatrix}sI-A&-B\\C&D\end{bmatrix} \). Explain why a transmission zero corresponds to an input-state pair producing zero output.

Solution: If \( z \) is a zero, then \( \mathcal{P}(z) \) loses rank, so there is a nonzero vector \( \begin{bmatrix}x_z^T&u_z^T\end{bmatrix}^T \) such that

\[ (zI-A)x_z-Bu_z=0,\qquad Cx_z+Du_z=0. \]

Choosing \( x(t)=x_z e^{zt} \) and \( u(t)=u_z e^{zt} \) satisfies the state equation, while \( y(t)=0 \). Thus the signal is internally present but externally blocked.

Problem 2 (Feedback Invariance): Prove that static state feedback \( u=-Kx+v \) does not change finite transmission zeros.

Solution: The closed-loop Rosenbrock matrix is

\[ \mathcal{P}_K(s)= \begin{bmatrix}sI-A+BK&-B\\C-DK&D\end{bmatrix} = \mathcal{P}(s) \begin{bmatrix}I&0\\-K&I\end{bmatrix}. \]

The second factor is nonsingular. Hence the rank of \( \mathcal{P}_K(s) \) equals the rank of \( \mathcal{P}(s) \) for every finite \( s \). Therefore all finite rank-loss points are identical before and after state feedback.

Problem 3 (SISO Example): For \( G(s)=\frac{1-s}{s^2+3s+2} \), determine the zero and explain why it cannot be stably cancelled.

Solution: The numerator is \( 1-s \), so the zero is \( s=1 \). Because \( \operatorname{Re}(1)>0 \), it is a right-half-plane zero. Cancelling it requires a compensator pole at \( s=1 \), which is unstable. Therefore stable compensation cannot remove this zero.

Problem 4 (Steady-State Tracking Obstruction): Show why a zero at \( s=0 \) obstructs exact constant reference tracking by static state feedback and feedforward.

Solution: Constant tracking requires a steady-state solution of

\[ \begin{bmatrix}-A+BK&-B\\C-DK&D\end{bmatrix} \begin{bmatrix}x_{ss}\\Nr\end{bmatrix} = \begin{bmatrix}0\\r\end{bmatrix}. \]

If the Rosenbrock matrix at \( s=0 \) has deficient rank in the needed output direction, the linear equations are not solvable for arbitrary constant references. Since feedback does not alter this rank defect, no choice of \( K \) repairs the obstruction.

Problem 5 (Pole Placement vs Zero Constraint): In the worked example, choose \( K \) so that the poles become \( -5 \) and \( -6 \), then compute the closed-loop zero.

Solution: The desired denominator is \( (s+5)(s+6)=s^2+11s+30 \). Since \( A-BK= \begin{bmatrix}0&1\\-2-k_1&-3-k_2\end{bmatrix} \), match coefficients:

\[ k_1=30-2=28,\qquad k_2=11-3=8. \]

Thus \( K=\begin{bmatrix}28&8\end{bmatrix} \). The closed-loop transfer is

\[ G_K(s)=\frac{1-s}{s^2+11s+30}, \]

so the zero remains \( +1 \).

11. Summary

State feedback is primarily a pole-shaping mechanism. It changes the closed-loop state matrix from \( A \) to \( A-BK \), but it does not change the finite transmission zeros of the plant. Right-half-plane zeros cannot be cancelled by stable compensators and therefore impose limits on tracking speed, bandwidth, inverse response, decoupling, and disturbance rejection. A realistic state-feedback design must therefore examine both controllability and transmission-zero structure before selecting aggressive closed-loop poles.

12. References

  1. Davison, E.J. (1974). Properties and calculation of transmission zeros of linear multivariable systems. Automatica, 10(6), 643–658.
  2. MacFarlane, A.G.J., & Karcanias, N. (1976). Poles and zeros of linear multivariable systems: A survey of the algebraic, geometric and complex-variable theory. International Journal of Control, 24(1), 33–74.
  3. Morse, A.S. (1973). Structural invariants of linear multivariable systems. SIAM Journal on Control, 11(3), 446–465.
  4. Silverman, L.M., & Payne, H.J. (1971). Input-output structure of linear systems with application to the decoupling problem. SIAM Journal on Control, 9(2), 199–233.
  5. Wonham, W.M. (1967). On pole assignment in multi-input controllable linear systems. IEEE Transactions on Automatic Control, 12(6), 660–665.
  6. Wonham, W.M., & Morse, A.S. (1970). Decoupling and pole assignment in linear multivariable systems: A geometric approach. SIAM Journal on Control, 8(1), 1–18.
  7. Francis, B.A., & Wonham, W.M. (1976). The internal model principle for linear multivariable regulators. Applied Mathematics and Optimization, 2(2), 170–194.
  8. Karcanias, N., & Kouvaritakis, B. (1979). The output zeroing problem and its relationship to the invariant zero structure. International Journal of Control, 30(3), 395–415.