Get associated multiplier


(Rishabh Gupta) #1

HI,

I am working on a code and have all my constraints in ‘for’ loop.

Can I assign and get the dual variable values associated with an equality constraint? I’m trying the method given in the examples but the code always gives an error (Dual variable “lambda” has already been assigned.)

excerpt from the code:

cvx_begin
variables pG(5) qG(5)
dual variable lambda
minimize c*(pG)

subject to

    for k=1:5
     bus(:,k)'*pG - pD(k) == pf            %%% need dual variable value for these set of equations
    end


cvx_end


(Mark L. Stone) #2

Dual variables can be assigned to equality constraints (you just have to be careful on the sign convention, or lack thereof, by various dual variable generators and users).

Have you looked at the example in http://cvxr.com/cvx/doc/advanced.html#indexed-dual-variables and used index dual variables?


(Rishabh Gupta) #3

Thank you, I tried implementing the dual variable similarly as in the example shared, however, the error I’m getting now is ‘Undefined operator ‘:’ for input arguments of type ‘cvx’.’ However, my other simple codes do not give such error when I define dual variables.

cvx_begin
variables pG(n) qG(n)
dual variables y{n}
minimize c*(pG)

subject to

    for k=1:n
     bus(:,k)'*pG - pD(k) == pf         :  y{k};   %%% need dual variable value for these set of equations
    end

(Mark L. Stone) #4

I don;t know why the error is occurring,

But I think you don’t need indexed dual variables.

Instead of the for loop, use

dual variable y
bus*pG - pD == pf :y

Although I’m not sure that works either.

Hmm, perhaps there is a bug in CVX. Full disclosure: I never use dual variables, so don’t have experience with them or know whether this syntax used to work.

However, this example from http://cvxr.com/cvx/doc/advanced.html#indexed-dual-variables works

n=2; b=[0;0];
cvx_begin
    variable X( n, n ) symmetric
    dual variables y{n}
    minimize( ( n - 1 : -1 : 0 ) * diag( X ) );
    for k = 0 : n-1,
        sum( diag( X, k ) ) == b( k+1 ) : y{k+1};
    end
    X == semidefinite(n);
cvx_end