Skip to contents

Check whether a statespace realization of a rational matrix is minimal. The procedure constructs the Hankel matrix of the impulse response coefficients with \(s\) block rows and \(s\) block columns, where \(s\) is the statespace dimension of the given statespace realization. If this statespace realization is minimal then the Hankel matrix has rank \(s\). Therefore the procedure returns TRUE if the \(s\)-th singular values of the Hankel matrix is larger than tol.

Usage

is.minimal(x, ...)

# S3 method for stsp
is.minimal(x, tol = sqrt(.Machine$double.eps), only.answer = TRUE, ...)

Arguments

x

(stsp object) rational matrix in statespace form.

...

not used.

tol

a tolerance parameter, which is used to decide the rank of the Hankel matrix of the impulse response coefficients.

only.answer

if TRUE, just return a logical (TRUE or FALSE). Otherwise a list with additional information is returned.

Value

If only.answer is true then a logical (TRUE or FALSE) is returned. Otherwise, a list with the following slots is returned.

answer

A boolean as above.

H

Hankel matrix of impulse response coefficients (with s block rows and s block columns).

sv

The singular values of H.

s0

(integer) (estimate of the) rank of H, i.e. the minimal statespace dimension.

Details

The procedure does not check whether the statespace realization is observable and/or controllable. To this end one may compute the observability/controllability matrices (obs_matrix, ctr_matrix) or the corresponding Grammians (grammians).

Note

This procedure returns different objects, depending on the parameter only.answer.

See also

Examples

x = test_stsp(dim = c(2,2), s = 2)
is.minimal(x)
#> [1] TRUE
# note that operations on "stsp" objects may return non minimal realizations
# 
is.minimal(rbind(x, x), only.answer = FALSE)[c('answer','sv','s0')]
#> $answer
#> [1] FALSE
#> 
#> $sv
#> [1] 1.193897e+01 9.803011e+00 1.237546e-15 9.664655e-16 5.831224e-16
#> [6] 3.901318e-16 1.830748e-16 1.286344e-16
#> 
#> $s0
#> [1] 2
#> 
is.minimal(x %r% (x^(-1)), only.answer = FALSE)[c('answer','sv','s0')]
#> $answer
#> [1] FALSE
#> 
#> $sv
#> [1] 1.020457e-15 6.363449e-16 1.681273e-16 1.489697e-16 9.097829e-17
#> [6] 2.820746e-17 1.315440e-17 7.090990e-20
#> 
#> $s0
#> [1] 0
#> 

is.minimal(test_stsp(dim = c(2,0), s = 2))
#> [1] FALSE
is.minimal(test_stsp(dim = c(0,2), s = 0))
#> [1] TRUE