Hello!
Today I tried to convert the model of OPF Slover(byJavad Lavaei,
http://www.ieor.berkeley.edu/~lavaei/Software.html),which is a SDP relaxition of large scale optimal power flow modeled by CVX,to YALMIP.
It runs correctly.But when the size of problem become larger ,its run time explode.
Here is his code:
--------------------------------------------------------------------------------------------------------------------------
cvx_begin
if strcmp(solver,'sdpt3')
cvx_solver sdpt3
cvx_solver_settings('maxit',120,'gaptol',1e-15,'inftol',1e-15,'steptol',1e-15);
elseif strcmp(solver,'sedumi')
cvx_solver sedumi
elseif strcmp(solver,'mosek')
cvx_solver mosek
end
cvx_precision best
variable VV(nlx,nc) complex
variable V2(nb,nc)
variable Sg(ng,nc) complex
expression sf(nl,nc)
expression st(nl,nc)
expression sfP(nl,nc)
expression stP(nl,nc)
expression Sb(nb,nc)
expression W(nb*nc,nb*nc)
for rr = 1 : nc
in = (nb*(rr-1)+1) : (nb*rr);
ex = setdiff(1 : nl, cc{rr});
W(in,in) = W(in,in) + sparse(fx, tx, VV(:,rr), nb, nb);
W(in,in) = W(in,in) + sparse(tx, fx, conj(VV(:,rr)), nb, nb);
W(in,in) = W(in,in) + sparse(1:nb, 1:nb, V2(:,rr), nb, nb);
sf(ex,rr) = conj(diag(Yf(ex, :) * W(in,in) * incidentF(ex, :).'));
st(ex,rr) = conj(diag(Yt(ex, :) * W(in,in) * incidentT(ex, :).'));
Sb(:,rr) = Pd + Qd*1i + conj(diag(Ybus{rr} * W(in,in)));
sfP(ex,rr) = conj(diag(YfP(ex, :) * W(in,in) * incidentF(ex, :).'));
stP(ex,rr) = conj(diag(YtP(ex, :) * W(in,in) * incidentT(ex, :).'));
sf(cc{rr},rr) = zeros(length(cc{rr}),1);
st(cc{rr},rr) = zeros(length(cc{rr}),1);
sfP(cc{rr},rr) = zeros(length(cc{rr}),1);
stP(cc{rr},rr) = zeros(length(cc{rr}),1);
end
obj = sum(c2.*real(Sg(:,1)).^2 + c1.*real(Sg(:,1)) + c0);
panG = sum(sum(imag(Sg)));
panQL = sum(sum(ndxL_prob .* abs(sfP + stP)));
cost = obj + ep(1)*panG + ep(2)*panQL;
minimize( cost );
subject to
for rr = 1 : nc
for kk = 1 : nBag
in = nb*(rr-1) + busN(bags{kk});
W(in,in) == hermitian_semidefinite(size(bags{kk},2));
end
end
Sb == incidentG.' * Sg;
V2 <= (Vmax.^2) * ones(1,nc);
V2 >= (Vmin.^2) * ones(1,nc);
abs(sf) .* edges <= SlmMax * ones(1,nc);
abs(st) .* edges <= SlmMax * ones(1,nc);
real(Sg) <= Pmax * ones(1,nc);
real(Sg) >= Pmin * ones(1,nc);
imag(Sg) <= Qmax * ones(1,nc);
imag(Sg) >= Qmin * ones(1,nc);
for rr = 2 : nc
abs(real(Sg(:,rr) - Sg(:,1))) <= correction;
end
cvx_end
--------------------------------------------------------------------------------------------------------------------------
here is mine
--------------------------------------------------------------------------------------------------------------------------
VV = sdpvar(nlx,nc,'full','complex');
V2 = sdpvar(nb,nc);
Sg = sdpvar(ng,nc,'full','complex');
sf = sdpvar(nl,nc,'full','complex');
st = sdpvar(nl,nc,'full','complex');
sfP = sdpvar(nl,nc,'full','complex');
stP = sdpvar(nl,nc,'full','complex');
Sb = sdpvar(nb,nc,'full','complex');
W = sdpvar(nb*nc,nb*nc,'hermitian','complex');
for rr = 1 : nc
in = (nb*(rr-1)+1) : (nb*rr);
ex = setdiff(1 : nl, cc{rr});
W(in,in) = W(in,in) + sparse(fx, tx, VV(:,rr), nb, nb);
W(in,in) = W(in,in) + sparse(tx, fx, conj(VV(:,rr)), nb, nb);
W(in,in) = W(in,in) + sparse(1:nb, 1:nb, V2(:,rr), nb, nb);
sf(ex,rr) = conj(diag(Yf(ex, :) * W(in,in) * incidentF(ex, :).'));
st(ex,rr) = conj(diag(Yt(ex, :) * W(in,in) * incidentT(ex, :).'));
Sb(:,rr) = Pd + Qd*1i + conj(diag(Ybus{rr} * W(in,in)));
sfP(ex,rr) = conj(diag(YfP(ex, :) * W(in,in) * incidentF(ex, :).'));
stP(ex,rr) = conj(diag(YtP(ex, :) * W(in,in) * incidentT(ex, :).'));
sf(cc{rr},rr) = zeros(length(cc{rr}),1);
st(cc{rr},rr) = zeros(length(cc{rr}),1);
sfP(cc{rr},rr) = zeros(length(cc{rr}),1);
stP(cc{rr},rr) = zeros(length(cc{rr}),1);
end
obj = sum(c2.*real(Sg(:,1)).^2 + c1.*real(Sg(:,1)) + c0);
panG = sum(sum(imag(Sg)));
panQL = sum(sum(ndxL_prob .* abs(sfP + stP)));
cost = obj + ep(1)*panG + ep(2)*panQL;
Constraints = [];
for rr = 1 : nc
for kk = 1 : nBag
in = nb*(rr-1) + busN(bags{kk});
Constraints = [Constraints,W(in,in) >= 0];
end
end
Constraints = [Constraints,Sb == incidentG.' * Sg];
Constraints = [Constraints,V2 <= (Vmax.^2) * ones(1,nc)];
Constraints = [Constraints,V2 >= (Vmin.^2) * ones(1,nc)];
Constraints = [Constraints,abs(sf) .* edges <= SlmMax * ones(1,nc)];
Constraints = [Constraints,abs(st) .* edges <= SlmMax * ones(1,nc)];
Constraints = [Constraints,real(Sg) <= Pmax * ones(1,nc)];
Constraints = [Constraints,real(Sg) >= Pmin * ones(1,nc)];
Constraints = [Constraints,imag(Sg) <= Qmax * ones(1,nc)];
Constraints = [Constraints,imag(Sg) >= Qmin * ones(1,nc)];
for rr = 2 : nc
Constraints = [Constraints,abs(real(Sg(:,rr) - Sg(:,1))) <= correction];
end
% options = sdpsettings('verbose',1,'solver','sdpt3');
results = optimize(Constraints,cost);
double(cost)
--------------------------------------------------------------------------------------------------------------------------
only the case<ieee 118 have the same magnitude of run time
i guess i have something wrong.