matlabcvx

How to pass MATLAB syms/symbolics to cvx sdp solver?


I have a 3D matrix At, n x n x nvar, and nvar variables y1...y25. I was easily able to feed the variables into cvx:

cvx_begin sdp;
    variable A(2*nbus,2*nbus) symmetric;
    variable y(1,nvar);
    maximize sum(y*Mfun);
    A ==  subs(At,yt,y(1,nvar));

However, the equality on the last line is giving me this error:

Error using sym/subs>normalize (line 197)
Substitution expression X must be a symbolic, cell, or numeric array.
Error in sym/subs>mupadsubs (line 137)
[X2,Y2,symX,symY] = normalize(X,Y); %#ok
Error in sym/subs (line 125)
    G = mupadsubs(F,X,Y);

I have tried to set up that equality a few different ways:

Using the same for loop I created At with in the first place (using Cfun, a matrix of doubles):

A == for k = 1:nvar
    At = At + yt(k)*Cfun(:,:,k);
end

Which gives this error:

Error: File: proj.m Line: 124 Column: 11
Illegal use of reserved keyword "for".

I didn't really expect that one to work, but figured it was worth a try.

I have also tried using bsxfun to create the matrix inside cvx, but I don't believe bsxfun is capable of handling symbolics. repmat is an alternative to 'bsxfun' (so I'm told) which I'm looking into now.

The reason I am trying to do the problem in this way is to create a routine that can use cvx to solve an optimal power flow for any number/combination of buses, without have to create variable individually each time.


Solution

  • After posting I spent 30 more minutes on it and figured it out. Rather than writing the for loop inside the equality constraint, I wrote it cvx_begin after the variable declaration:

    cvx_begin sdp;
        variable A(2*nbus,2*nbus) symmetric;
        variable y(1,nVar);
        maximize sum(y*Mfun);
        for k = 1:nVar
            At = At + y(k)*Cfun(:,:,k);
        end
        for k = 1:size(cY,3)
            At = At + cY(:,:,k);
        end
        A ==  At;
        for k = 1:nIneq
            y(k)>=0;
        end
        A>=0;
    cvx_end;