Chapter 6: Relationship Between Transfer Functions and State Space

Lesson 2: Poles and Zeros in the State-Space Representation

This lesson formalizes how classical poles and zeros emerge from a state-space model \( (A,B,C,D) \). We prove that (under standard assumptions) poles are tied to the eigenstructure of \( A \), and we introduce state-space (transmission) zeros via the Rosenbrock system matrix and rank conditions. The emphasis is on rigorous derivations that build directly on Lesson 1’s identity \( G(s)=C(sI-A)^{-1}B + D \).

1. Learning Objectives

  • Derive pole locations from \( \det(sI-A) \) and relate them to eigenvalues of \( A \).
  • Compute SISO zeros as roots of a state-space numerator polynomial; understand pole–zero cancellations.
  • Define MIMO (transmission) zeros using the Rosenbrock system matrix and prove equivalent characterizations.
  • Prove invariance of poles and transmission zeros under similarity transformations.
  • Implement pole/zero computations in Python, C++, Java, MATLAB/Simulink, and Wolfram Mathematica.

2. Roadmap: From (A,B,C,D) to Poles and Zeros

Lesson 1 established the transfer function of a continuous-time LTI state-space model \( \dot{x}=Ax+Bu,\; y=Cx+Du \) (zero initial state) as:

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

This lesson extracts poles and zeros directly from \( A,B,C,D \). The key idea is that \( (sI-A)^{-1} \) is a rational matrix with denominator \( \det(sI-A) \), while zeros arise from a numerator condition (SISO) or a rank-drop condition (MIMO).

flowchart TD
  A["Given state-space (A,B,C,D)"] --> B["Form G(s) = C*(sI-A)^(-1)*B + D"]
  B --> C["Poles: where det(sI-A)=0 \n(possible cancellations)"]
  B --> D["SISO zeros: \nroots of numerator polynomial"]
  B --> E["MIMO zeros: \nrank drop of Rosenbrock matrix P(s)"]
  C --> F["Pole-zero structure \nof input-output map"]
  D --> F
  E --> F
        

3. Poles in State Space: Eigenvalues and \(\det(sI-A)\)

For an n-state realization, \( (sI-A) \) is an \( n\times n \) matrix polynomial in \( s \). Its determinant is the characteristic polynomial:

\[ \chi_A(s) = \det(sI-A). \]

Proposition 3.1 (Rational structure of \((sI-A)^{-1}\)). For any square matrix \( A \),

\[ (sI-A)^{-1} = \frac{\operatorname{adj}(sI-A)}{\det(sI-A)}, \]

where \( \operatorname{adj}(\cdot) \) is the adjugate matrix whose entries are polynomials of degree at most \( n-1 \).

Proof. By definition of adjugate, for any square matrix \( M \):

\[ M\,\operatorname{adj}(M) = \operatorname{adj}(M)\,M = \det(M)\,I. \]

Apply this to \( M=sI-A \) and right-multiply by \( 1/\det(sI-A) \) (for values of \( s \) where the determinant is nonzero) to obtain the stated identity.

Substituting into the transfer function, \( G(s)=C(sI-A)^{-1}B+D \) becomes a rational function whose possible poles are among the roots of \( \det(sI-A) \).

Definition 3.1 (Poles of the transfer function). Poles are values \( s_0 \) where some entry of \( G(s) \) becomes unbounded.

Corollary 3.1 (Candidate poles). Every pole of \( G(s) \) must be a root of \( \det(sI-A) \), unless that factor cancels with a matching factor in the numerator.

Since \( \chi_A(s)=0 \) if and only if \( s \) is an eigenvalue of \( A \), we obtain the classical bridge: \( \lambda \) is a (candidate) pole \( \Leftrightarrow \) \( \lambda \) is an eigenvalue of \( A \). Cancellations (discussed in Section 5) explain why some eigenvalues of \( A \) may not appear as poles of the reduced transfer function.

4. SISO Zeros from \((A,B,C,D)\): Numerator Construction

In the SISO case (\( u\in\mathbb{R},\, y\in\mathbb{R} \)), \( G(s) \) is a scalar rational function. Using Proposition 3.1, the transfer function can be written as:

\[ G(s) = \frac{C\,\operatorname{adj}(sI-A)\,B + D\,\det(sI-A)}{\det(sI-A)}. \]

Hence, an (unreduced) numerator polynomial is: \( N(s)=C\,\operatorname{adj}(sI-A)\,B + D\,\det(sI-A) \), and a denominator polynomial is \( \Delta(s)=\det(sI-A) \).

Definition 4.1 (SISO zeros). Zeros are values \( s_0 \) where \( G(s_0)=0 \) (after canceling common factors, if any).

Proposition 4.1 (Block-determinant identity for SISO). Define the Rosenbrock (SISO) system matrix:

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

Then (for values of \( s \) where \( sI-A \) is invertible):

\[ \det(P(s)) = \det(sI-A)\,\big(D + C(sI-A)^{-1}B\big) = \det(sI-A)\,G(s). \]

Proof. Use the Schur complement formula for block determinants (with \( M=sI-A \)):

\[ \det\!\begin{bmatrix} M & N \\ P & Q \end{bmatrix} = \det(M)\,\det(Q - P M^{-1}N), \quad \text{when } \det(M)\neq 0. \]

Here \( N=-B,\; P=C,\; Q=D \), so \( Q - P M^{-1}N = D - C(sI-A)^{-1}(-B)=D + C(sI-A)^{-1}B \).

This identity is especially useful: in SISO, zeros correspond to roots of \( \det(P(s)) \) that do not cancel with \( \det(sI-A) \).

5. Pole–Zero Cancellations and “Hidden” Modes (Without Advanced Decomposition)

In state space, \( A \) always contains all internal modes of the chosen realization, but the transfer function only reveals modes that are “seen” through the input–output channel. A pole–zero cancellation occurs when a factor of \( \det(sI-A) \) is also a factor of the numerator polynomial, so that the reduced transfer function has fewer poles than \( A \) has eigenvalues.

Example 5.1 (A cancellation induced by output selection). Consider

\[ 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=\begin{bmatrix}0\end{bmatrix}. \]

Compute \( \det(sI-A)=s^2+3s+2=(s+1)(s+2) \). One can show (by direct inversion) that:

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

The realization’s \( A \) has eigenvalues \( -1 \) and \( -2 \), but the reduced transfer function has only pole \( -2 \). The pole at \( -1 \) is canceled by a zero at \( -1 \) in the unreduced expression.

This is the first place where you see a distinctly “modern” viewpoint: internal mode structure can be richer than what the input–output map exposes. (A formal theory of when cancellations occur is developed later, after controllability/observability are introduced.)

6. MIMO (Transmission) Zeros in State Space

For MIMO systems, “zeros” are not fully captured by entrywise zeros of \( G(s) \). A coordinate-free definition uses the Rosenbrock system matrix:

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

Definition 6.1 (Normal rank and transmission zeros). Let

\[ r_n = \max_{s\in\mathbb{C}} \operatorname{rank}\big(P(s)\big). \]

A complex number \( s_0 \) is a transmission zero if

\[ \operatorname{rank}\big(P(s_0)\big) \; < \; r_n. \]

Intuitively: at a transmission zero, there exists a nontrivial internal signal configuration that satisfies the frequency-domain state and output constraints with a nonzero input direction, producing zero output.

Proposition 6.1 (Equivalent “zero-output” characterization). A complex number \( s_0 \) is a transmission zero if and only if there exist vectors \( x_0\neq 0 \) and \( u_0 \) (not both zero) such that:

\[ (s_0I-A)x_0 - Bu_0 = 0,\qquad Cx_0 + Du_0 = 0. \]

Proof. The block equations above are precisely:

\[ P(s_0)\begin{bmatrix}x_0\\u_0\end{bmatrix} = 0. \]

Thus, a nontrivial solution exists if and only if \( P(s_0) \) loses full column rank relative to its normal rank, i.e., \( \operatorname{rank}(P(s_0)) \) drops below \( r_n \).

In the SISO case, this rank-drop reduces to the determinant condition in Section 4: \( \det(P(s_0))=0 \).

7. Coordinate Invariance and Practical Computation

A core modern-control principle is that the internal coordinate choice should not change input–output properties. Let \( T \) be an invertible change of coordinates \( x = Tz \). Then the transformed realization is: \( \dot{z}=\bar{A}z+\bar{B}u,\; y=\bar{C}z+Du \) with \( \bar{A}=T^{-1}AT,\; \bar{B}=T^{-1}B,\; \bar{C}=CT \).

Proposition 7.1 (Pole invariance). \( A \) and \( \bar{A}=T^{-1}AT \) have the same characteristic polynomial and hence the same eigenvalues.

Proof.

\[ \det(sI-\bar{A})=\det\big(sI-T^{-1}AT\big)=\det\big(T^{-1}(sI-A)T\big)= \\ \det(T^{-1})\det(sI-A)\det(T)=\det(sI-A). \]

Proposition 7.2 (Transmission-zero invariance). The Rosenbrock matrix transforms by invertible premultiplication/postmultiplication that preserves rank, hence transmission zeros are invariant.

Sketch. Using the transformed matrices, one verifies:

\[ \bar{P}(s)=\begin{bmatrix}sI-\bar{A}&-\bar{B}\\\bar{C}&D\end{bmatrix} = \begin{bmatrix}T^{-1}&0\\0&I\end{bmatrix} \begin{bmatrix}sI-A&-B\\C&D\end{bmatrix} \begin{bmatrix}T&0\\0&I\end{bmatrix}. \]

Since multiplication by invertible matrices does not change rank, \( \operatorname{rank}(\bar{P}(s))=\operatorname{rank}(P(s)) \) for all \( s \), hence the rank-drop points (transmission zeros) coincide.

The practical computation pipeline below is what you will use repeatedly in later chapters.

flowchart TD
  S["Input matrices A,B,C,D"] --> P1["Poles = eig(A)"]
  S --> Z1["Zeros from P(s) rank drop (software: tzero / invariant zeros)"]
  Z1 --> Z2["SISO shortcut: numerator roots from det(P(s))"]
  P1 --> V["Validate by forming G(s) and simplifying"]
  Z2 --> V
  V --> M["Plot pole-zero map; check cancellations"]
        

8. Implementations

We reuse Example 5.1 throughout for consistency. When libraries return “extra” poles/zeros, it is typically because they report the realization’s internal structure before cancellation; always compare with the simplified transfer function.

8.1 Python (NumPy/SciPy + python-control)

Recommended libraries: numpy, scipy, control (python-control).

import numpy as np
import scipy.linalg as la

# Optional (if available): pip install control
try:
    import control as ct
except Exception:
    ct = None

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]])

# Poles from A (internal candidate poles)
poles_A = la.eigvals(A)
print("eig(A) =", poles_A)

# SISO transmission zeros via generalized eigenvalues of a Rosenbrock pencil
# P(s) = s*E - F, with
# E = [[I, 0],
#      [0, 0]]
# F = [[A, B],
#      [-C, -D]]
n = A.shape[0]
E = np.block([[np.eye(n), np.zeros((n,1))],
              [np.zeros((1,n)), np.zeros((1,1))]])
F = np.block([[A, B],
              [-C, -D]])

# Generalized eigenvalues solve F v = lambda E v (lambda are finite zeros + possibly inf)
alpha, beta = la.eig(F, E, right=False, left=False, overwrite_a=False, overwrite_b=False, homogeneous_eigvals=True)
# Convert homogeneous eigenvalues alpha/beta to lambda, filtering beta=0 (infinite eigenvalues)
zeros = []
for a, b in zip(alpha, beta):
    if abs(b) > 1e-12:
        zeros.append(a / b)
zeros = np.array(zeros, dtype=complex)
print("zeros (finite generalized eig) =", zeros)

# Validate by forming transfer function (if python-control is installed)
if ct is not None:
    sys = ct.ss(A, B, C, D)
    tf_sys = ct.tf(sys)
    print("Transfer function (unsimplified) =", tf_sys)
    print("Poles from tf =", ct.poles(tf_sys))
    print("Zeros from tf =", ct.zeros(tf_sys))

8.2 C++ (Eigen)

Recommended library: Eigen (header-only linear algebra). For SISO zeros, we use a generalized eigenvalue approach on the pencil \( Fv=\lambda Ev \) constructed from \( P(s)=sE-F \).

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

#include <Eigen/Dense>
#include <Eigen/Eigenvalues>

int main() {
  using Eigen::MatrixXd;
  using Eigen::VectorXcd;

  MatrixXd A(2,2); A << 0, 1,
                         -2, -3;
  MatrixXd B(2,1); B << 0,
                         1;
  MatrixXd C(1,2); C << 1, 1;
  MatrixXd D(1,1); D << 0;

  // Poles: eigenvalues of A
  Eigen::EigenSolver<MatrixXd> esA(A);
  VectorXcd poles = esA.eigenvalues();
  std::cout << "eig(A) poles:\n" << poles << "\n\n";

  // Build Rosenbrock pencil for SISO:
  // P(s) = [[sI-A, -B],[C, D]] = s*E - F
  // E = [[I, 0],[0, 0]], F = [[A, B],[-C, -D]]
  int n = 2;
  MatrixXd E = MatrixXd::Zero(n+1, n+1);
  E.block(0,0,n,n) = MatrixXd::Identity(n,n);

  MatrixXd F = MatrixXd::Zero(n+1, n+1);
  F.block(0,0,n,n) = A;
  F.block(0,n,n,1) = B;
  F.block(n,0,1,n) = -C;
  F(n,n) = -D(0,0);

  // Generalized eigenvalues: F v = lambda E v
  Eigen::GeneralizedEigenSolver<MatrixXd> ges(F, E);
  VectorXcd lambdas = ges.eigenvalues();

  std::cout << "Generalized eigenvalues (finite zeros appear among these):\n";
  for (int i=0; i<lambdas.size(); ++i) {
    std::complex<double> lam = lambdas(i);
    // Filter huge magnitudes as "infinite" placeholders (heuristic)
    if (std::abs(lam) < 1e8) {
      std::cout << "  " << lam << "\n";
    }
  }
  return 0;
}

8.3 Java (EJML + Apache Commons Math)

Recommended libraries: EJML for matrix computations and Apache Commons Math for polynomial root finding. To keep the implementation transparent and aligned with this lesson, we compute SISO numerator/denominator explicitly for a 2-state example:

  • \( \Delta(s)=\det(sI-A) \) (a quadratic),
  • \( N(s)=\det(P(s)) \) (a cubic or lower, but reduces here).
// Requires (typical):
//   org.ejml:ejml-all
//   org.apache.commons:commons-math3

import org.apache.commons.math3.analysis.solvers.LaguerreSolver;
import org.apache.commons.math3.complex.Complex;

public class PoleZeroFromStateSpaceSISO2 {
  // For the 2x2 example, compute:
  // Delta(s) = det(sI-A) = s^2 - tr(A)s + det(A)
  // and N(s) = det(P(s)) = det([[sI-A, -B],[C, D]]) (3x3 determinant)
  public static void main(String[] args) {
    double[][] A = { {0, 1},
                    {-2, -3} };
    double[] B = {0, 1};
    double[] C = {1, 1};
    double D = 0;

    // Delta(s) = det([[s-0, -1],[2, s+3]]) = (s)(s+3)+2 = s^2+3s+2
    double[] delta = {2, 3, 1}; // 2 + 3 s + 1 s^2

    // Build det(P(s)) directly for this specific structure:
    // P(s) = [[ s, -1, -B1],
    //         [ 2, s+3, -B2],
    //         [ C1, C2, D ]]
    // Here B1=0, B2=1, C1=1, C2=1, D=0.
    // Compute determinant symbolically:
    // det(P) = s*det([[s+3, -1],[1, 0]]) - (-1)*det([[2, -1],[1, 0]]) + 0*...
    //        = s*((s+3)*0 - (-1)*1) + 1*(2*0 - (-1)*1)
    //        = s*(1) + 1*(1) = s+1
    double[] num = {1, 1}; // 1 + 1 s

    // Roots using LaguerreSolver expects coefficients highest order first
    LaguerreSolver solver = new LaguerreSolver();

    Complex[] poles = solver.solveAllComplex(new double[]{delta[2], delta[1], delta[0]}, 0);
    Complex[] zeros = solver.solveAllComplex(new double[]{num[1], num[0]}, 0);

    System.out.println("Poles (roots of Delta):");
    for (Complex c : poles) System.out.println("  " + c);

    System.out.println("Zeros (roots of N):");
    for (Complex c : zeros) System.out.println("  " + c);

    System.out.println("Note: cancellation may remove common pole/zero factors in the reduced G(s).");
  }
}

8.4 MATLAB / Simulink

Recommended toolboxes: Control System Toolbox (for ss, tf, pole, zero, tzero), Simulink (for state-space modeling and linear analysis).

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

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

% Internal candidate poles from A
pA = eig(A)

% Poles/zeros of the transfer function (cancellation handled in minimal TF form)
G = tf(sys);
p_tf = pole(G)
z_tf = zero(G)

% Transmission zeros (general definition; works for MIMO too)
z_t = tzero(sys)

% Visual check
pzmap(G); grid on;

Simulink workflow (no images required).

  1. Create a new Simulink model and add a State-Space block.
  2. Enter matrices \( A,B,C,D \) and connect an input source (e.g., Step) to the block.
  3. Use Model Linearizer (Linear Analysis) to obtain a linear model and plot a pole-zero map.
  4. Compare the pole map against \( \operatorname{eig}(A) \) to detect cancellations.

8.5 Wolfram Mathematica

Mathematica provides native state-space and transfer-function objects with pole/zero queries.

A = { {0, 1}, {-2, -3} };
B = { {0}, {1} };
C = { {1, 1} };
D = { {0} };

sys = StateSpaceModel[{A, B, C, D}];

(* Poles from A *)
Eigenvalues[A]

(* Transfer function and its poles/zeros *)
tf = TransferFunctionModel[sys, s];
tf // Simplify

SystemPoles[tf]
SystemZeros[tf]

(* Transmission / invariant zeros (state-space notion) *)
InvariantZeros[sys]

9. Problems and Solutions

Problem 1 (Poles from \(\det(sI-A)\)). Let \( A=\begin{bmatrix}0&1\\-2&-3\end{bmatrix} \). Compute \( \det(sI-A) \) and the poles implied by \( A \).

Solution. We have

\[ sI-A=\begin{bmatrix}s&-1\\2&s+3\end{bmatrix} \quad\Rightarrow\quad \det(sI-A)=s(s+3)+2=s^2+3s+2=(s+1)(s+2). \]

Therefore the eigenvalues of \( A \) (candidate poles) are \( s=-1 \) and \( s=-2 \).


Problem 2 (SISO transfer function and cancellation). Using Example 5.1: \( A=\begin{bmatrix}0&1\\-2&-3\end{bmatrix} \), \( B=\begin{bmatrix}0\\1\end{bmatrix} \), \( C=\begin{bmatrix}1&1\end{bmatrix} \), \( D=0 \). Compute \( G(s)=C(sI-A)^{-1}B \), identify the unreduced pole/zero structure, and give the reduced form.

Solution. First compute the inverse:

\[ (sI-A)^{-1}=\frac{1}{s^2+3s+2}\begin{bmatrix}s+3&1\\-2&s\end{bmatrix}. \]

Then

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

Unreduced: poles at \( -1,-2 \) and a zero at \( -1 \). After canceling \( (s+1) \), the reduced transfer function is \( G(s)=1/(s+2) \).


Problem 3 (Transmission zero characterization). Prove that \( s_0 \) is a transmission zero if and only if there exist \( x_0,u_0 \), not both zero, such that: \( (s_0I-A)x_0-Bu_0=0 \) and \( Cx_0+Du_0=0 \).

Solution. The two equations can be stacked into one homogeneous equation:

\[ \begin{bmatrix} s_0I-A & -B\\ C & D \end{bmatrix} \begin{bmatrix}x_0\\u_0\end{bmatrix}=0 \quad\Leftrightarrow\quad P(s_0)\begin{bmatrix}x_0\\u_0\end{bmatrix}=0. \]

A nontrivial solution exists exactly when the null space is nontrivial, i.e., when \( P(s_0) \) loses rank compared to its normal rank. This is precisely the rank-drop definition of a transmission zero.


Problem 4 (Invariance of poles under similarity transformations). Let \( \bar{A}=T^{-1}AT \) with \( T \) invertible. Show that \( \det(sI-\bar{A})=\det(sI-A) \).

Solution.

\[ \det(sI-\bar{A}) =\det\big(sI-T^{-1}AT\big) =\det\big(T^{-1}(sI-A)T\big) = \\ \det(T^{-1})\det(sI-A)\det(T) =\det(sI-A). \]

Hence \( A \) and \( \bar{A} \) have identical eigenvalues, so poles implied by \( A \) are coordinate-invariant.


Problem 5 (SISO numerator via \(\det(P(s))\)). For SISO, prove \( \det(P(s))=\det(sI-A)\,G(s) \). Then use it to compute \( \det(P(s)) \) for Example 5.1.

Solution. By the Schur complement (Section 4),

\[ \det(P(s))=\det(sI-A)\,\det\big(D + C(sI-A)^{-1}B\big). \]

For SISO, the inner determinant is the scalar \( D + C(sI-A)^{-1}B \), i.e., \( G(s) \). Hence \( \det(P(s))=\det(sI-A)\,G(s) \).

In Example 5.1, \( \det(sI-A)=(s+1)(s+2) \) and \( G(s)=(s+1)/((s+1)(s+2)) \), so

\[ \det(P(s))=(s+1)(s+2)\cdot \frac{s+1}{(s+1)(s+2)} = s+1. \]

Therefore the (unreduced) zero is \( s=-1 \).

10. Summary

We proved that poles of \( G(s)=C(sI-A)^{-1}B+D \) must lie among the roots of \( \det(sI-A) \), i.e., eigenvalues of \( A \), except when canceled by numerator factors. For SISO systems, zeros can be computed from a numerator polynomial \( N(s)=C\,\operatorname{adj}(sI-A)B + D\det(sI-A) \), equivalently from \( \det(P(s)) \). For MIMO systems, zeros are defined intrinsically as rank-drop points of the Rosenbrock matrix \( P(s) \), and we established an equivalent “zero-output with nontrivial internal behavior” characterization. Finally, we showed that both poles and transmission zeros are invariant under similarity transformations, matching the modern-control principle of coordinate-free system properties.

11. References

  1. Rosenbrock, H.H. (1973). The zeros of a system. International Journal of Control, 18(2), 297–299.
  2. Davison, E.J., & Wang, S.H. (1974). Properties and calculation of transmission zeros of linear multivariable systems. Automatica, 10(6), 643–658.
  3. 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.
  4. Sain, M.K., & Massey, J.L. (1969). Invertibility of linear time-invariant dynamical systems. IEEE Transactions on Automatic Control, AC-14(2), 141–149.
  5. Schrader, C.B., & Sain, M.K. (1989). Research on system zeros: A survey. International Journal of Control, 50(4), 1407–1433.