expmCond.RdCompute the exponential condition number of a matrix, either with approximation methods, or exactly and very slowly.
a square matrix
a string; either compute 1-norm or F-norm approximations, or compte these exactly.
logical indicating if the matrix exponential itself, which is computed anyway, should be returned as well.
for method = "F.est", numerical \(\ge 0\),
as absolute and relative error tolerance.
for method = "exact", specify if only the
1-norm, the Frobenius norm, or both are to be computed.
method = "exact", aka Kronecker-Sylvester algorithm, computes a
Kronecker matrix of dimension \(n^2 \times n^2\) and
hence, with \(O(n^5)\) complexity, is prohibitely slow for
non-small \(n\). It computes the exact exponential-condition
numbers for both the Frobenius and/or the 1-norm, depending on
give.exact.
The two other methods compute approximations, to these norms, i.e., estimate them, using algorithms from Higham, chapt.~3.4, both with complexity \(O(n^3)\).
when expm = TRUE, for method = "exact", a
list with components
containing the matrix exponential, expm.Higham08(A).
numeric scalar, (an approximation to) the (matrix
exponential) condition number, for either the 1-norm
(expmCond1) or the Frobenius-norm (expmCondF).
When expm is false and method one of the approximations
("*.est"), the condition number is returned directly (i.e.,
numeric of length one).
Awad H. Al-Mohy and Nicholas J. Higham (2009). Computing Fréchet Derivative of the Matrix Exponential, with an application to Condition Number Estimation; MIMS EPrint 2008.26; Manchester Institute for Mathematical Sciences, U. Manchester, UK. https://eprints.maths.manchester.ac.uk/1218/01/covered/MIMS_ep2008_26.pdf
Higham, N.~J. (2008). Functions of Matrices: Theory and Computation; Society for Industrial and Applied Mathematics, Philadelphia, PA, USA.
Michael Stadelmann (2009) Matrixfunktionen ...
Master's thesis; see reference in expm.Higham08.
expm.Higham08 for the matrix exponential.
set.seed(101)
(A <- matrix(round(rnorm(3^2),1), 3,3))
#> [,1] [,2] [,3]
#> [1,] -0.3 0.2 0.6
#> [2,] 0.6 0.3 -0.1
#> [3,] -0.7 1.2 0.9
eA <- expm.Higham08(A)
stopifnot(all.equal(eA, expm::expm(A), tolerance= 1e-15))
C1 <- expmCond(A, "exact")
C2 <- expmCond(A, "1.est")
C3 <- expmCond(A, "F.est")
all.equal(C1$expmCond1, C2$expmCond, tolerance= 1e-15)# TRUE
#> [1] "Modes: numeric, NULL" "Lengths: 1, 0"
#> [3] "target is numeric, current is NULL"
all.equal(C1$expmCondF, C3$expmCond)# relative difference of 0.001...
#> [1] "Modes: numeric, NULL" "Lengths: 1, 0"
#> [3] "target is numeric, current is NULL"