State-space canonical realization


csys = canon(sys,type)
[csys,T]= canon(sys,type)
csys = canon(sys,'modal',condt)


csys = canon(sys,type) transforms the linear model sys into a canonical state-space model csys. The argument type specifies whether csys is in modal or companion form.

[csys,T]= canon(sys,type) also returns the state-coordinate transformation T that relates the states of the state-space model sys to the states of csys.

csys = canon(sys,'modal',condt) specifies an upper bound condt on the condition number of the block-diagonalizing transformation.

Input Arguments


Any linear dynamic system model, except for frd models.


String specifying the type of canonical form of csys. type can take one of the two following values:


Positive scalar value specifying an upper bound on the condition number of the block-diagonalizing transformation that converts sys to csys. This argument is available only when type is 'modal'.

Increase condt to reduce the size of the eigenvalue clusters in the A matrix of csys. Setting condt = Inf diagonalizes A.

Default: 1e8

Output Arguments


State-space (ss) model. csys is a state-space realization of sys in the canonical form specified by type.


Matrix specifying the transformation between the state vector x of the state-space model sys and the state vector xc of csys:

xc = Tx


This argument is available only when sys is state-space model.


This example uses canon to convert a system having doubled poles and clusters of close poles to modal canonical form.

Consider the system G having the following transfer function:


To create a linear model of this system and convert it to modal canonical form, enter:

G = zpk([1 -1],[0 -10 -10.0001 1+1i 1-1i 1+1i 1-1i],100);
Gc = canon(G,'modal');

The system G has a pair of nearby poles at s = –10 and s = –10.0001. G also has two complex poles of multiplicity 2 at s = 1 + i and s = 1 – i. As a result, the modal form, has a block of size 2 for the two poles near s = –10, and a block of size 4 for the complex eigenvalues. To see this, enter the following command:

ans =

         0         0         0         0         0         0         0
         0    1.0000    1.0000         0         0         0         0
         0   -1.0000    1.0000    2.0548         0         0         0
         0         0         0    1.0000    1.0000         0         0
         0         0         0   -1.0000    1.0000         0         0
         0         0         0         0         0  -10.0000    8.0573
         0         0         0         0         0         0  -10.0001

To separate the two poles near s = –10, you can increase the value of condt. For example:

Gc2 = canon(G,'modal',1e10);
ans =

         0         0         0         0         0         0         0
         0    1.0000    1.0000         0         0         0         0
         0   -1.0000    1.0000    2.0548         0         0         0
         0         0         0    1.0000    1.0000         0         0
         0         0         0   -1.0000    1.0000         0         0
         0         0         0         0         0  -10.0000         0
         0         0         0         0         0         0  -10.0001

The A matrix of Gc2 includes separate diagonal elements for the poles near s = –10. The cost of increasing the maximum condition number of A is that the B matrix includes some large values.

format shortE

ans =


This example estimates a state-space model that is freely parameterized and convert to companion form after estimation.

load icEngine.mat
z = iddata(y,u,0.04);
FreeModel = n4sid(z,4,'InputDelay',2); 
CanonicalModel = canon(FreeModel, 'companion')

Obtain the covariance of the resulting form by running a zero-iteration update to model parameters.

opt = ssestOptions; opt.SearchOption.MaxIter = 0;
CanonicalModel  = ssest(z, CanonicalModel, opt)

Compare frequency response confidence bounds of FreeModel to CanonicalModel.

h = bodeplot(FreeModel, CanonicalModel)

the bounds are identical.

More About

collapse all

Modal Form

In modal form, A is a block-diagonal matrix. The block size is typically 1-by-1 for real eigenvalues and 2-by-2 for complex eigenvalues. However, if there are repeated eigenvalues or clusters of nearby eigenvalues, the block size can be larger.

For example, for a system with eigenvalues (λ1,σ±jω,λ2), the modal A matrix is of the form


Companion Form

In the companion realization, the characteristic polynomial of the system appears explicitly in the rightmost column of the A matrix. For a system with characteristic polynomial


the corresponding companion A matrix is


The companion transformation requires that the system be controllable from the first input. The companion form is poorly conditioned for most state-space computations; avoid using it when possible.


The canon command uses the bdschur command to convert sys into modal form and to compute the transformation T. If sys is not a state-space model, the algorithm first converts it to state space using ss.

The reduction to companion form uses a state similarity transformation based on the controllability matrix [1].


[1] Kailath, T. Linear Systems, Prentice-Hall, 1980.

See Also

| |

Introduced before R2006a

Was this topic helpful?