Positive or Negative Semidefiniteness
semidefiniteness.RdCheck whether a symmetric matrix is positive or negative semidefinite.
Usage
isSemidefinite( m, ... )
# Default S3 method
isSemidefinite( m, ... )
# S3 method for class 'matrix'
isSemidefinite( m, positive = TRUE,
tol = 100 * .Machine$double.eps,
method = ifelse( nrow( m ) < 13, "det", "eigen" ), ... )
# S3 method for class 'list'
isSemidefinite( m, ... )
semidefiniteness( m, ... )Arguments
- m
a symmetric quadratic matrix or a list containing symmetric quadratic matrices.
- positive
logical. Check for positive semidefiniteness (if
TRUE, default) or for negative semidefiniteness (ifFALSE).- tol
tolerance level (values between
-tolandtolare considered to be zero).- method
method to test for semidefiniteness, either checking the signs of the principal minors (if
"det", default for matrices with up to 12 rows/columns) or checking the signs of the eigenvalues (if"eigen", default for matrices with 13 or more rows/columns).- ...
further arguments of
isSemidefinite.listare passed toisSemidefinite.matrix;. further arguments ofsemidefinitenessare passed toisSemidefinite; further arguments of other functions are currently ignored.
Details
Function semidefiniteness() passes all its arguments
to isSemidefinite().
It is only kept for backward-compatibility
and may be removed in the future.
If argument positive is set to FALSE,
isSemidefinite() checks for negative semidefiniteness
by checking for positive semidefiniteness
of the negative of argument m, i.e. -m.
If method "det" is used
(default for matrices with up to 12 rows/columns),
isSemidefinite() checks whether all principal minors
(not only the leading principal minors)
of the matrix m
(or of the matrix -m if argument positive is FALSE)
are larger than -tol.
Due to rounding errors,
which are unavoidable on digital computers,
the calculated determinants of singular (sub-)matrices
(which should theoretically be zero)
can considerably deviate from zero.
In order to reduce the probability of incorrect results
due to rounding errors,
isSemidefinite() does not calculate the determinants
of (sub-)matrices with reciprocal condition numbers
smaller than argument tol
but sets the corresponding principal minors to (exactly) zero.
The number of principal minors of an \(N \times N\) matrix is
\(\sum_{k=1}^N ( N\) choose \( k )\),
which gets very large for large matrices.
Therefore, it is not recommended to use method "det"
for matrices with, say, more than 12 rows/columns.
If method "eigen"
(default for matrices with 13 or more rows/columns) is used,
isSemidefinite() checks whether all eigenvalues
of the matrix m
(or of the matrix -m if argument positive is FALSE)
are larger than -tol.
In case of a singular or nearly singular matrix,
some eigenvalues
that theoretically should be zero
can considerably deviate from zero
due to rounding errors,
which are unavoidable on digital computers.
isSemidefinite() uses the following procedure
to reduce the probability of incorrectly returning FALSE
due to rounding errors in the calculation of eigenvalues
of singular or nearly singular matrices:
if the reciprocal condition number of an \(N \times N\) matrix
is smaller than argument tol
and not all of the eigenvalues of this matrix are larger than -tol,
isSemidefinite() checks
whether all \(( N\) choose \( (N-k) )\)
\((N-k) \times (N-k)\) submatrices
are positive semidefinite,
where \(k\) with \(0 < k < N\) is the number of eigenvalues
in the interval -tol and tol.
If necessary, this procedure is done recursively.
Please note that a matrix can be neither positive semidefinite nor negative semidefinite.
Value
isSemidefinite() and semidefiniteness()
return a locigal value (if argument m is a matrix)
or a logical vector (if argument m is a list)
indicating whether the matrix (or each of the matrices)
is positive/negative (depending on argument positive)
semidefinite.
References
Chiang, A.C. (1984): Fundamental Methods of Mathematical Economics, 3rd ed., McGraw-Hill.
Gantmacher, F.R. (1959): The Theory of Matrices, Chelsea Publishing.
Examples
# a positive semidefinite matrix
isSemidefinite( matrix( 1, 3, 3 ))
#> [1] TRUE
# a negative semidefinite matrix
isSemidefinite( matrix(-1, 3, 3 ), positive = FALSE )
#> [1] TRUE
# a matrix that is positive and negative semidefinite
isSemidefinite( matrix( 0, 3, 3 ))
#> [1] TRUE
isSemidefinite( matrix( 0, 3, 3 ), positive = FALSE )
#> [1] TRUE
# a matrix that is neither positive nor negative semidefinite
isSemidefinite( symMatrix( 1:6 ) )
#> [1] FALSE
isSemidefinite( symMatrix( 1:6 ), positive = FALSE )
#> [1] FALSE
# checking a list of matrices
ml <- list( matrix( 1, 3, 3 ), matrix(-1, 3, 3 ), matrix( 0, 3, 3 ) )
isSemidefinite( ml )
#> [1] TRUE FALSE TRUE
isSemidefinite( ml, positive = FALSE )
#> [1] FALSE TRUE TRUE