Back to Cvxpy

Semidefinite program

doc/source/examples/basic/sdp.rst

1.8.22.2 KB
Original Source

Semidefinite program

A semidefinite program (SDP) is an optimization problem of the form

.. math::

   \begin{array}{ll}
   \mbox{minimize}   & \mathbf{tr}(CX) \\
   \mbox{subject to} & \mathbf{tr}(A_iX) = b_i, \quad i=1,\ldots,p \\
                     & X \succeq 0,
   \end{array}

where :math:\mathbf{tr} is the trace function, :math:X \in \mathcal{S}^{n} is the optimization variable and :math:C, A_1, \ldots, A_p \in \mathcal{S}^{n}, and :math:b_1, \ldots, b_p \in \mathcal{R} are problem data, and :math:X \succeq 0 is a matrix inequality. Here :math:\mathcal{S}^{n} denotes the set of :math:n-by-:math:n symmetric matrices.

An example of an SDP is to complete a covariance matrix :math:\tilde \Sigma \in \mathcal{S}^{n}_+ with missing entries :math:M \subset \{1,\ldots,n\} \times \{1,\ldots,n\}:

.. math::

   \begin{array}{ll}
   \mbox{minimize}   & 0 \\
   \mbox{subject to} & \Sigma_{ij} = \tilde \Sigma_{ij}, \quad (i,j) \notin M \\
                     & \Sigma \succeq 0,
   \end{array}

Example

In the following code, we solve a SDP with CVXPY.

.. code:: python

# Import packages.
import cvxpy as cp
import numpy as np

# Generate a random SDP.
n = 3
p = 3
np.random.seed(1)
C = np.random.randn(n, n)
A = []
b = []
for i in range(p):
    A.append(np.random.randn(n, n))
    b.append(np.random.randn())

# Define and solve the CVXPY problem.
# Create a symmetric matrix variable.
X = cp.Variable((n,n), symmetric=True)
# The operator >> denotes matrix inequality.
constraints = [X >> 0]
constraints += [
    cp.trace(A[i] @ X) == b[i] for i in range(p)
]
prob = cp.Problem(cp.Minimize(cp.trace(C @ X)),
                  constraints)
prob.solve()

# Print result.
print("The optimal value is", prob.value)
print("A solution X is")
print(X.value)

.. parsed-literal::

The optimal value is 2.654348003008652
A solution X is
[[ 1.6080571  -0.59770202 -0.69575904]
 [-0.59770202  0.22228637  0.24689205]
 [-0.69575904  0.24689205  1.39679396]]