Skip to contents

Give the eigenvalues or the entire eigen decomposition of a multi-companion matrix

Usage

mc_eigen(x, ...)
mc_eigenvalues(x, ...)

Arguments

x

a multi-companion matrix, an object of class MultiCompanion.

...

additional arguments, currently not used.

Details

Both functions first check if the decomposition is stored in x and, if that is the case, return the result without computations. This is particularly useful when the matrix is created from its spectral decomposition in the first place. The only restrictions on the result in this case come from the structure of multi-companion matrices.

Otherwise they use eigen to do the main computation. In addition, if the top of the matrix has structural columns of zeroes, mc_eigen takes care to call eigen with a sub-matrix whose last column is not zero, and handles the zero eigenvalues separately.

Note that x@mo.col is the last column containing nonzero elements in the top of the matrix. By calling eigen on the top left x@mo.col square block, rather than on the entire matrix, we achieve several things. Firstly, this block may turn out to be non-singular. In that case, the chains corresponding to zero eigenvalues, if any, are structural and straightforward. Secondly, if this block turns out to be singular, we know that by reducing the dimension we have left out only elements corresponding to zero eigenvalues. The vectors associated with zero eigenvalues are somewhat tricky in this case, but manageable.

The net effect is that the only restriction comes from the use of eigen, which does not handle Jordan chains of length larger than one. In general, this is not a problem, since chains with more than one vector are not likely to occur numerically. In particular, it is relatively safe to assume that the space spanned by the non-zero eigenvalues of the multicompanion matrix has a basis of eigenvectors. However, when x@mo.col is smaller than the dimension of the matrix, eigenchains associated with the zero value can easily occur, due to the structure of the matrix. That is why we pay special attention to them.

In mc_eigen the handling of the zero eigenvalues is based on mc_chain_extend. The latter takes care also of zero eigenvalues whose Jordan blocks are of size larger than one.

Value

For mc_eigenvalues, the eigenvalues as a vector.

For mc_eigen, the eigenvalues and eigenvectors as a list with components values and vectors. In addition the list contains a component len.block with the lengths of the Jordan chains.

References

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

Author

Georgi N. Boshnakov

Note

mc_eigenvalues currently simply calls eigen if the eigenvalues are not stored in the object. It is probably mostly useful when the interest is in the nonzero eigenvalues.

Examples

x <- sim_mc(6,4,mo.col=2)
x
#> $eigval
#> [1] -0.3088802-0.2271863i -0.3088802+0.2271863i  0.0000000+0.0000000i
#> [4]  0.0000000+0.0000000i  0.0000000+0.0000000i  0.0000000+0.0000000i
#> 
#> $len.block
#> [1] 1 1 1 1 1 1
#> 
#> $mo
#> [1] 4
#> 
#> $eigvec
#>                       [,1]                  [,2] [,3] [,4] [,5] [,6]
#> [1,] -0.0833435-0.2563971i -0.0833435+0.2563971i 0+0i 0+0i 0+0i 0+0i
#> [2,]  0.2351837-0.0329803i  0.2351837+0.0329803i 0+0i 0+0i 0+0i 0+0i
#> [3,]  0.5238359+0.3722448i  0.5238359-0.3722448i 1+0i 0+0i 0+0i 0+0i
#> [4,]  0.1080478+0.1280066i  0.1080478-0.1280066i 0+0i 1+0i 0+0i 0+0i
#> [5,]  0.5713014+0.4098847i  0.5713014-0.4098847i 0+0i 0+0i 1+0i 0+0i
#> [6,] -0.4431413+0.4327113i -0.4431413-0.4327113i 0+0i 0+0i 0+0i 1+0i
#> 
#> $co
#>                       [,1]                  [,2]
#> [1,]  0.5238359+0.3722448i  0.5238359-0.3722448i
#> [2,]  0.1080478+0.1280066i  0.1080478-0.1280066i
#> [3,]  0.5713014+0.4098847i  0.5713014-0.4098847i
#> [4,] -0.4431413+0.4327113i -0.4431413-0.4327113i
#> 
#> $mo.col
#> [1] 2
#> 
#> $mat
#>            [,1]          [,2] [,3] [,4] [,5] [,6]
#> [1,] -0.3490392 -2.619098e-01    0    0    0    0
#> [2,]  0.2032240 -2.687213e-01    0    0    0    0
#> [3,]  0.9132120 -4.776387e-03    0    0    0    0
#> [4,]  0.2412956  6.725789e-02    0    0    0    0
#> [5,]  1.0000000 -6.490750e-17    0    0    0    0
#> [6,]  0.0000000  1.000000e+00    0    0    0    0
#> 
y <- mCompanion(x,detect="gen")
y
#> 6 x 6 Matrix of class "MultiCompanion"
#>            [,1]         [,2] [,3] [,4] [,5] [,6]
#> [1,] -0.3490392 -0.261909764    0    0    0    0
#> [2,]  0.2032240 -0.268721262    0    0    0    0
#> [3,]  0.9132120 -0.004776387    0    0    0    0
#> [4,]  0.2412956  0.067257889    0    0    0    0
#> [5,]  1.0000000  0.000000000    0    0    0    0
#> [6,]  0.0000000  1.000000000    0    0    0    0
z <- as.matrix(y)
xx <- mCompanion(x=z,mo.col=2)
mc_eigen(xx)
#> $values
#> [1] -0.3088802+0.2271863i -0.3088802-0.2271863i  0.0000000+0.0000000i
#> [4]  0.0000000+0.0000000i  0.0000000+0.0000000i  0.0000000+0.0000000i
#> 
#> $vectors
#>                       [,1]                  [,2] [,3] [,4] [,5] [,6]
#> [1,]  0.7503898+0.0000000i  0.7503898+0.0000000i 0+0i 0+0i 0+0i 0+0i
#> [2,] -0.1150582-0.6509046i -0.1150582+0.6509046i 0+0i 0+0i 0+0i 0+0i
#> [3,] -1.4360451-1.0662993i -1.4360451+1.0662993i 1+0i 0+0i 0+0i 0+0i
#> [4,] -0.4317980-0.1758614i -0.4317980+0.1758614i 0+0i 1+0i 0+0i 0+0i
#> [5,] -1.5765175-1.1595536i -1.5765175+1.1595536i 0+0i 0+0i 1+0i 0+0i
#> [6,] -0.7640929+1.5453018i -0.7640929-1.5453018i 0+0i 0+0i 0+0i 1+0i
#> 
#> $len.block
#> [1] 1 1 1 1 1 1
#>