The eigen decomposition of a multi-companion matrix
mc_eigen.Rd
Give the eigenvalues or the entire eigen decomposition of a multi-companion matrix
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 .
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
#>