# canon

State-space canonical realization

## Syntax

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

## Description

`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

 `sys` Any linear dynamic system model, except for `frd` models. `type` String specifying the type of canonical form of `csys`. `type` can take one of the two following values: `'modal'` — convert `sys` to modal form.`'companion'` — convert `sys` to companion form. `condt` 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

 `csys` State-space (`ss`) model. `csys` is a state-space realization of `sys` in the canonical form specified by `type`. `T` 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.

## Examples

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:

`$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)\right)}^{2}}.$`

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:

`Gc.A`
```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); Gc2.A```
```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 Gc2.B ans = 3.2000e-001 -6.5691e-003 5.4046e-002 -1.9502e-001 1.0637e+000 3.2533e+005 3.2533e+005```

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.

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 $\left({\lambda }_{1},\sigma ±j\omega ,{\lambda }_{2}\right)$, the modal A matrix is of the form

`$\left[\begin{array}{cccc}{\lambda }_{1}& 0& 0& 0\\ 0& \sigma & \omega & 0\\ 0& -\omega & \sigma & 0\\ 0& 0& 0& {\lambda }_{2}\end{array}\right]$`

### 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

`$p\left(s\right)={s}^{n}+{\alpha }_{1}{s}^{n-1}+\dots +{\alpha }_{n-1}s+{\alpha }_{n}$`

the corresponding companion A matrix is

`$A=\left[\begin{array}{cccccc}0& 0& ..& ..& 0& -{\alpha }_{n}\\ 1& 0& 0& ..& 0& -{\alpha }_{n}-1\\ 0& 1& 0& .& :& :\\ :& 0& .& .& :& :\\ 0& .& .& 1& 0& -{\alpha }_{2}\\ 0& ..& ..& 0& 1& -{\alpha }_{1}\end{array}\right]$`

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.

### Algorithms

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

## References

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