# isproper

Determine if dynamic system model is proper

## Syntax

```B = isproper(sys) B = isproper(sys,'elem') [B,sysr] = isproper(sys) ```

## Description

`B = isproper(sys)` returns a logical value of `1` (`true`) if the dynamic system model `sys` is proper and a logical value of `0` (`false`) otherwise.

A proper model has relative degree ≤ 0 and is causal. SISO transfer functions and zero-pole-gain models are proper if the degree of their numerator is less than or equal to the degree of their denominator (in other words, if they have at least as many poles as zeroes). MIMO transfer functions are proper if all their SISO entries are proper. Regular state-space models (state-space models having no `E` matrix) are always proper. A descriptor state-space model that has an invertible `E` matrix is always proper. A descriptor state-space model having a singular (non-invertible) `E` matrix is proper if the model has at least as many poles as zeroes.

If `sys` is a model array, then `B` is `1` if all models in the array are proper.

`B = isproper(sys,'elem')` checks each model in a model array `sys` and returns a logical array of the same size as `sys`. The logical array indicates which models in `sys` are proper.

`[B,sysr] = isproper(sys)` also returns an equivalent model `sysr` with fewer states (reduced order) and a non-singular `E` matrix, if `sys` is a proper descriptor state-space model with a non-invertible `E` matrix. If `sys` is not proper, `sysr = sys`.

## Examples

collapse all

Create a SISO continuous-time transfer function, ${H}_{1}=s$

`H1 = tf([1 0],1);`

Check whether `H1` is proper.

`B1 = isproper(H1)`
```B1 = logical 0 ```

SISO transfer functions are proper if the degree of their numerator is less than or equal to the degree of their denominator That is, if the transfer function has at least as many poles as zeroes. Since `H1` has one zero and no poles, the `isproper` command returns `0`.

Now create a transfer function with one pole and one zero, ${H}_{2}=s/\left(s+1\right)$

`H2 = tf([1 0],[1 1]);`

Check whether `H2` is proper.

`B2 = isproper(H2)`
```B2 = logical 1 ```

Since `H2` has equal number of poles and zeros, `isproper` returns `1`.

Combining state-space models sometimes yields results that include more states than necessary. Use `isproper` to compute an equivalent lower-order model.

```H1 = ss(tf([1 1],[1 2 5])); H2 = ss(tf([1 7],[1])); H = H1*H2; size(H)```
```State-space model with 1 outputs, 1 inputs, and 4 states. ```

`H` is proper and reducible. `isproper` returns the reduced model.

```[isprop,Hr] = isproper(H); size(Hr)```
```State-space model with 1 outputs, 1 inputs, and 2 states. ```

`H` and `Hr` are equivalent, as a Bode plot demonstrates.

```bodeplot(H,Hr,'r--') legend('original','reduced')```

## References

[1] Varga, Andràs. "Computation of irreducible generalized state-space realizations." Kybernetika 26.2 (1990): 89-106.

## Version History

Introduced before R2006a