Skip to contents

Extend Jordan chains of a multi-companion matrix to higher dimension and complete them to a full system by adding eigenchains for zero eigenvalues.

Usage

mc_chain_extend(ev, newdim)

Arguments

ev

eigenvalues and eigenvectors, a list with components values and vectors.

newdim

the new dimension of the vectors.

Details

The eigenvectors of a multi-companion matrix have a special structure. This function extends the supplied eigenvectors to be eigenvectors of a higher-dimensional multi-companion matrix of the same multi-companion order with the same top rows extended with zeroes.

ev is a list with components values, vectors and possibly others. In particular, ev may be the value returned by a call to the base function eigen(). A component len.block may be used to specify the lengths of the Jordan chains, by default all are of length one.

The function handles also the case when only the first mo.col columns of the top of the original multi-companion matrix are non-zero. This may be specified by a component mo.col in ev, otherwise mo.col is set to the dimension of the space spanned by the non-zero eigenvalues.

When mo.col is smaller than the multi-companion order, the information in the eigenvectors is not sufficient to extend them. The missing entries are supplied via the argument F0bot (TODO: describe!).

Chains corresponding to zero eigenvalues come last in the result.

Value

The eigenvectors extended to the new dimension.

References

Boshnakov GN (2002). “Multi-companion matrices.” Linear Algebra Appl., 354, 53--83. ISSN 0024-3795, doi:10.1016/S0024-3795(01)00475-X .

Boshnakov GN, Iqelan BM (2009). “Generation of time series models with given spectral properties.” J. Time Series Anal., 30(3), 349--368. ISSN 0143-9782, doi:10.1111/j.1467-9892.2009.00617.x .

Author

Georgi N. Boshnakov

See also

mc_eigen;

the main work is done by mC.non0chain.extend and mc_0chains.

Examples

ev <- make_mcchains(eigval = c(1, 0.5), co = cbind(c(1,1), c(1, -1)), dim = 4,
              mo.col = 2,
              len.block = c(1, 1))
ev
#> $eigval
#> [1] 1.0 0.5
#> 
#> $len.block
#> [1] 1 1
#> 
#> $mo
#> [1] 2
#> 
#> $eigvec
#>      [,1] [,2]
#> [1,]    1  0.5
#> [2,]    1 -0.5
#> [3,]    1  1.0
#> [4,]    1 -1.0
#> 
#> $co
#>      [,1] [,2]
#> [1,]    1    1
#> [2,]    1   -1
#> 
#> $mo.col
#> [1] 2
#> 
## extend evecs in ev to the requested dim and complete with chains for eval 0.
mc_chain_extend(ev = ev, newdim = 6)
#> $mo
#> [1] 2
#> 
#> $mo.col
#> [1] 2
#> 
#> $eigval
#> [1] 1.0 0.5 0.0 0.0
#> 
#> $len.block
#> [1] 1 1 2 2
#> 
#> $eigvec
#>      [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,]    1  0.5    0    0    0    0
#> [2,]    1 -0.5    0    0    0    0
#> [3,]    1  1.0    0    1    0    0
#> [4,]    1 -1.0    0    0    0    1
#> [5,]    1  2.0    1    0    0    0
#> [6,]    1 -2.0    0    0    1    0
#> 
#> $co
#>      [,1] [,2] [,3] [,4] [,5] [,6]
#> [1,]    1    2    1    0    0    0
#> [2,]    1   -2    0    0    1    0
#> 
mc_chain_extend(ev = ev, newdim = 7)
#> $mo
#> [1] 2
#> 
#> $mo.col
#> [1] 2
#> 
#> $eigval
#> [1] 1.0 0.5 0.0 0.0
#> 
#> $len.block
#> [1] 1 1 3 2
#> 
#> $eigvec
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#> [1,]    1  0.5    0    0    0    0    0
#> [2,]    1 -0.5    0    0    0    0    0
#> [3,]    1  1.0    0    0    1    0    0
#> [4,]    1 -1.0    0    0    0    0    1
#> [5,]    1  2.0    0    1    0    0    0
#> [6,]    1 -2.0    0    0    0    1    0
#> [7,]    1  4.0    1    0    0    0    0
#> 
#> $co
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#> [1,]    1   -2    0    0    0    1    0
#> [2,]    1    4    1    0    0    0    0
#>