This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English verison of the page.

Note: This page has been translated by MathWorks. Please click here
To view all translated materals including this page, select Japan from the country navigator on the bottom of this page.


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.


Canonical form of csys, specified as one of the 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.


collapse all

Consider a system with doubled poles and clusters of close poles:

$$G\left( s \right) = 100\frac{{\left( {s - 1} \right)\left( {s + 1}
\right)}}{{s\left( {s + 10} \right)\left( {s + 10.0001} \right){{\left(
{s - \left( {1 + i} \right)} \right)}^2}{{\left( {s - \left( {1 - i} \right)}

Create a linear model of this system, and convert it to modal canonical form.

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.

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

Separate the two poles near $s = -10$ by increasing the value of the condition number of the block-diagonalizing transformation. The default value of the condition number is 1e8.

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 condition number of A is that the B matrix includes some large values.

format shortE
ans =


Estimate a state-space model that is freely parameterized.

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

Convert the estimated model to companion canonical form.

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,'r.');

The frequency response confidence 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?