       Re: How can I solve semidefinite programming problems? Can any one with

• To: mathgroup at smc.vnet.net
• Subject: [mg114859] Re: How can I solve semidefinite programming problems? Can any one with
• From: Daniel Lichtblau <danl at wolfram.com>
• Date: Mon, 20 Dec 2010 00:41:45 -0500 (EST)
• References: <ieklo8\$4uf\$1@smc.vnet.net>

```On Dec 19, 4:11 am, fmingu <fmi... at 163.com> wrote:
> Hello.
>
>  I am a student learning signal processing. I need my data to be calculated which needs optimization. And I am using Mathematica for programming. But till now I do not find any functions in mathematica for semidefinte programming. The problem is
>
>  min C'XC
>
> s.t. B>=0, W>=0 ,t>=0, X'=X
>
> where C' ,X' are the transpose of C and X, respectively. C,B,W are  matrices where B is a block matrix containing X. t is a number to be calculated. X is the unknown symmetic matrix to be found. I asked Nathan Brixius, the author of SDPMATH package which is used in Mathematica for semidefinite programming in 90's. But the link to SDPMATH package is missing (http://www.cs.uiowa.edu/~brixius/sdp.html). And after I wrote a letter to the author, he said the package is lost.
>
> How can I solve semidefinite programming problems in mathematica? Are there any innard or build-in methods in mathematica? Can any one with kindness help me?
>
> Thanks a lot.

You might be able to finesse the positive definiteness constraints, at
least for smallish problems. This can be done by defining a function
that operates only on explicitly numeric matrices and returns the
minimal eigenvalue.

In the code and simple  example below I do not check that the matrix
inputs are square and symmetric, but I enforce that in the way it is
called. This might need adjusting for various usages. I also do not
know whether Eigenvalues will always come up with real values when
given a symmetric input, as it is a numeric algorithm and subject to
numeric error. So I take the real part of the eigenvalues it computes.

In:= n = 5;
cc = RandomInteger[{0, 10}, n];

In:= xvars = Array[x, {n, n}];
Do[x[i, j] = x[j, i], {i, 2, n}, {j, i - 1}]
fvars = Union[Flatten[xvars]];

In:= mineig[mat : {{_?NumericQ ..} ..}] :=
With[{eigvals = Eigenvalues[mat]}, Min[Re[eigvals]]]

In:= {min, vals} =
FindMinimum[{cc.xvars.cc, {mineig[xvars] >= 0}}, fvars]

During evaluation of In:= FindMinimum::eit: The algorithm does not
converge to the tolerance of 4.806217383937354`*^-6 in 500 iterations.
The best estimated solution, with feasibility residual, KKT residual,
or complementary residual of
{4.991839325346274*10^-7,0.0001756205712055703,1.006553812005796*10^-10},
is returned. >>

Out= {-0.000102810847622932, {x[1, 1] -> 0.4745617099801545,
x[1, 2] -> -0.2366811680109855, x[1, 3] -> -0.2132627776342026,
x[1, 4] -> -0.2702226619552426, x[1, 5] -> -0.2453269610921312,
x[2, 2] -> 0.4759415776673994, x[2, 3] -> -0.03653531695016651,
x[2, 4] -> 0.103983724598686, x[2, 5] -> -0.01760774267839494,
x[3, 3] -> 0.4587401126362137, x[3, 4] -> -0.0003398923289131131,
x[3, 5] -> -0.07268674827647269, x[4, 4] -> 0.7191478545392413,
x[4, 5] -> 0.004481278729767096, x[5, 5] -> 0.4939968048471287}}

We check by how much the constraint is violated. The minimal
eigenvalue is, one rather suspects, a fuzzy zero.

In:= mineig[xvars /. vals]

Out= -4.990836973695068*10^-7

This is very much a "Your mileage may vary" approach. I would not
expect it to be terribly fast. I would not be surprised if it has
difficulty in enforcing the constraint, for some (perhaps most?)
problems. You might try alterations such as adding an explicit penalty
term in the objective function, perhaps altering it based on
StepMonitor option setting, etc. Below is a very simple form of this
idea, probably not so useful in practice.

FindMinimum[{cc.xvars.cc -
10^5*mineig[xvars], {mineig[xvars] >= 0}}, fvars]

Daniel Lichtblau
Wolfram Research

```

• Prev by Date: Mathematica daily WTF
• Next by Date: Importing PDF files in version 8 Trial
• Previous by thread: How can I solve semidefinite programming problems? Can any one with
• Next by thread: Shift-Ctrl-N and Manipulate