-"""
+r"""
The positive semidefinite cone `$S^{n}_{+}$` is the cone consisting of
all symmetric positive-semidefinite matrices (as a subset of
`$\mathbb{R}^{n \times n}$`
from sage.all import *
-def is_symmetric_psd(A):
- """
- Determine whether or not the matrix ``A`` is symmetric
- positive-semidefinite.
-
- INPUT:
-
- - ``A`` - The matrix in question
-
- OUTPUT:
-
- Either ``True`` if ``A`` is symmetric positive-semidefinite, or
- ``False`` otherwise.
-
- SETUP::
-
- sage: from mjo.cone.symmetric_psd import is_symmetric_psd
-
- EXAMPLES:
-
- Every completely positive matrix is symmetric
- positive-semidefinite::
-
- sage: v = vector(map(abs, random_vector(ZZ, 10)))
- sage: A = v.column() * v.row()
- sage: is_symmetric_psd(A)
- True
-
- The following matrix is symmetric but not positive semidefinite::
-
- sage: A = matrix(ZZ, [[1, 2], [2, 1]])
- sage: is_symmetric_psd(A)
- False
-
- This matrix isn't even symmetric::
-
- sage: A = matrix(ZZ, [[1, 2], [3, 4]])
- sage: is_symmetric_psd(A)
- False
-
- The trivial matrix in a trivial space is trivially symmetric and
- positive-semidefinite::
-
- sage: A = matrix(QQ, 0,0)
- sage: is_symmetric_psd(A)
- True
-
- """
-
- if A.base_ring() == SR:
- msg = 'The matrix ``A`` cannot be symbolic.'
- raise ValueError.new(msg)
-
- # First make sure that ``A`` is symmetric.
- if not A.is_symmetric():
- return False
-
- # If ``A`` is symmetric, we only need to check that it is positive
- # semidefinite. For that we can consult its minimum eigenvalue,
- # which should be zero or greater. Since ``A`` is symmetric, its
- # eigenvalues are guaranteed to be real.
- if A.is_zero():
- # A is trivial... so trivially positive-semudefinite.
- return True
- else:
- return min(A.eigenvalues()) >= 0
-
-
def unit_eigenvectors(A):
"""
Return the unit eigenvectors of a symmetric positive-definite matrix.
SETUP::
- sage: from mjo.cone.symmetric_psd import (is_symmetric_psd,
- ....: random_symmetric_psd)
+ sage: from mjo.cone.symmetric_psd import random_symmetric_psd
EXAMPLES:
sage: A = random_symmetric_psd(V)
sage: A.matrix_space()
Full MatrixSpace of 2 by 2 dense matrices over Rational Field
- sage: is_symmetric_psd(A)
+ sage: A.is_positive_semidefinite()
True
A matrix with the desired rank is returned::