Check the Minimality of a Statespace Realization
is.minimal.Rd
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
).
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