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).
- Create a new Simulink model and add a State-Space block.
- Enter matrices \( A,B,C,D \) and connect an input source (e.g., Step) to the block.
- Use Model Linearizer (Linear Analysis) to obtain a linear model and plot a pole-zero map.
- 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
- Rosenbrock, H.H. (1973). The zeros of a system. International Journal of Control, 18(2), 297–299.
- Davison, E.J., & Wang, S.H. (1974). Properties and calculation of transmission zeros of linear multivariable systems. Automatica, 10(6), 643–658.
- 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.
- Sain, M.K., & Massey, J.L. (1969). Invertibility of linear time-invariant dynamical systems. IEEE Transactions on Automatic Control, AC-14(2), 141–149.
- Schrader, C.B., & Sain, M.K. (1989). Research on system zeros: A survey. International Journal of Control, 50(4), 1407–1433.