Skip to contents

The Hermitean transpose of a rational matrix \(x(z)\) is defined as $$x^{*}(z)=\overline{x(\bar{z}^{-1})}'.$$ This means e.g. for a polynomial with real coefficients \(x(z)=a_0 + a_1 z +\cdots + a_p z^p\) that the coefficient matrices are transposed and that \(z\) is replaced by \(z^{-1}\): \(x^*(z)=a_0' + a_1' z^{-1} +\cdots + a_p' z^{-p}\), i.e. the result is (in general) a Laurent polynomial.

Usage

Ht(x)

# S3 method for polm
Ht(x)

# S3 method for lpolm
Ht(x)

# S3 method for stsp
Ht(x)

# S3 method for zvalues
Ht(x)

Arguments

x

rational matrix object of class polm, lpolm, stsp or zvalues.

Value

A rational matrix object which represents the Hermitean transpose \(x^*(z)\). The Hermitean transpose of a polynomial matrix (in general) is a Laurent polynomial, therefore the output is of class lpolm if x is a polm object. In all other cases the output is of the same class as the input x.

Details

The Hermitean transpose is only implemented for polynomial matrices (polm objects), Laurent polynomials lpolm objects), rational matrices in statespace form (stsp objects) and for the frequency response of rational matrices (zvalues objects).

The case of rational matrices in LMFD or RMFD form has not (yet) been implemented. It is not possible to directly construct the Hermitean transpose from given power series coefficients. Therefore Ht() does not support pseries objects.

Finally note that the Hermitean transpose of a rational matrix \(x(z)=D+zB(I-Az)^{-1}B\) in statespace form (in general) has a pole at zero, if the state transition matrix \(A\) is singular. Since rational matrices with a pole at \(z=0\) have no statespace realization, the procedure Ht() throws an error in this case.

Examples

# rational matrix in statespace form 
x = test_stsp(dim = c(4,4), s = 2)
Ht(x)
#> statespace realization [4,4] with s = 2 states
#>             s[1]       s[2]        u[1]        u[2]        u[3]       u[4]
#> s[1] -0.24283103 -0.7059684 -0.09989289  0.13315421  0.29724454 -0.6432538
#> s[2]  0.85382717 -0.5736553 -0.85310520 -0.53490488 -0.05128600  0.4547386
#> x[1] -0.39710942  0.2611624  1.39455055  0.24865760  0.02568736 -0.2148316
#> x[2]  0.93899728 -1.6618782 -1.34451967  0.38922929  0.27890504 -0.1095495
#> x[3]  0.09675934  0.5834381  0.15887499 -0.04646097  0.78329694  0.4349713
#> x[4]  0.93023387 -1.3215050 -1.20394326 -0.59797821  0.17064849  1.0835703
all.equal(zvalues(Ht(x)), Ht(zvalues(x)))
#> [1] TRUE

# Note (x(z)  x^*(z)) is Hermitean for |z| = 1
xx = zvalues(x) %r% Ht(zvalues(x))
# print(xx, digits = 2)
apply(unclass(xx), MARGIN = 3, FUN = isSymmetric)
#> [1] TRUE TRUE TRUE TRUE TRUE

# polynomial matrix 
x = test_polm(dim = c(2,3), degree = 1)
Ht(x)
#> ( 3 x 2 ) Laurent polynomial matrix with degree <= 0, and minimal degree >= -1
#>      z^-1 [,1]  [,2] z^0 [,1]  [,2]
#> [1,]       111   211      110   210
#> [2,]       121   221      120   220
#> [3,]       131   231      130   230

if (FALSE) {
Ht(test_lmfd(dim = c(2,2), degrees = c(3,3)))
Ht(test_rmfd(dim = c(2,2), degrees = c(3,3)))
Ht(pseries(test_lmfd(dim = c(2,2), degrees = c(3,3))))
}