0001 function [results, success, raw] = lpopf_solver(om, mpopt)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0072 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0073 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0074 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0075 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0076 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0077 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0078 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0079 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0080
0081
0082 mpc = get_mpc(om);
0083 [baseMVA, bus, gen, branch, gencost] = ...
0084 deal(mpc.baseMVA, mpc.bus, mpc.gen, mpc.branch, mpc.gencost);
0085 vv = get_idx(om);
0086
0087
0088 nb = size(bus, 1);
0089 nl = size(branch, 1);
0090 ny = getN(om, 'var', 'y');
0091
0092
0093 [x0, LB, UB] = getv(om);
0094
0095
0096
0097 nxyz = length(x0);
0098 om2 = om;
0099 om2 = add_constraints(om2, 'varlims', speye(nxyz, nxyz), LB, UB);
0100 [vv, ll, nn] = get_idx(om2);
0101 [A, l, u] = linear_constraints(om2);
0102
0103
0104 if all(bus(:, LAM_P) == 0)
0105 bus(:, LAM_P) = (10)*ones(nb, 1);
0106 end
0107
0108
0109
0110 ieq = find( abs(u-l) <= eps );
0111 igt = find( u >= 1e10 & l > -1e10 );
0112 ilt = find( l <= -1e10 & u < 1e10 );
0113 ibx = find( (abs(u-l) > eps) & (u < 1e10) & (l > -1e10) );
0114 Af = [ A(ilt, :); -A(igt, :); A(ibx, :); -A(ibx, :) ];
0115 bf = [ u(ilt); -l(igt); u(ibx); -l(ibx)];
0116 Afeq = A(ieq, :);
0117 bfeq = u(ieq);
0118
0119
0120 [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch);
0121
0122
0123 il = find(branch(:, RATE_A) ~= 0 & branch(:, RATE_A) < 1e10);
0124 nl2 = length(il);
0125
0126
0127 mpopt(15) = 2 * nb + length(bfeq);
0128 if mpopt(19) == 0
0129 mpopt(19) = 150 + 2*nb;
0130 end
0131
0132
0133 [x, success_lf] = LPeqslvr(x0, om2, Ybus, Yf, Yt, Afeq, bfeq, Af, bf, mpopt);
0134 if success_lf ~= 1
0135 error('Sorry, cannot find a starting point using power flow, please check data!');
0136 end
0137
0138
0139 cstep = 0;
0140 if ny > 0
0141 PgQg = [gen(:, PG); gen(:, QG)];
0142 ipwl = find(gencost(:, MODEL) == PW_LINEAR);
0143 Cp = totcost(gencost(ipwl, :), PgQg(ipwl));
0144 cstep = max(abs(Cp));
0145 if cstep < 1.0e6, cstep = 1.0e6; end
0146 end
0147 step0 = ones(size(x0));
0148 step0(vv.i1.Va:vv.iN.Va) = 2;
0149 step0(vv.i1.Vm:vv.iN.Vm) = 1;
0150 step0(vv.i1.Pg:vv.iN.Pg) = 0.6;
0151 step0(vv.i1.Qg:vv.iN.Qg) = 0.3;
0152 if ny > 0
0153 step0(vv.i1.y:vv.iN.y) = cstep;
0154 end
0155
0156
0157 [x, lambda, success] = LPconstr('fun_copf', x0, mpopt, step0, [], [], 'grad_copf', ...
0158 'LPeqslvr', om2, Ybus, Yf(il,:), Yt(il,:), Afeq, bfeq, Af, bf, mpopt, il);
0159 info = success;
0160
0161
0162 [f, g] = feval('fun_copf', x, om2, Ybus, Yf(il,:), Yt(il,:), Afeq, bfeq, Af, bf, mpopt, il);
0163
0164
0165 Va = x(vv.i1.Va:vv.iN.Va);
0166 Vm = x(vv.i1.Vm:vv.iN.Vm);
0167 Pg = x(vv.i1.Pg:vv.iN.Pg);
0168 Qg = x(vv.i1.Qg:vv.iN.Qg);
0169 V = Vm .* exp(1j*Va);
0170
0171
0172
0173 bus(:, VA) = Va * 180/pi;
0174 bus(:, VM) = Vm;
0175 gen(:, PG) = Pg * baseMVA;
0176 gen(:, QG) = Qg * baseMVA;
0177 gen(:, VG) = Vm(gen(:, GEN_BUS));
0178
0179
0180 Sf = V(branch(:, F_BUS)) .* conj(Yf * V);
0181 St = V(branch(:, T_BUS)) .* conj(Yt * V);
0182 branch(:, PF) = real(Sf) * baseMVA;
0183 branch(:, QF) = imag(Sf) * baseMVA;
0184 branch(:, PT) = real(St) * baseMVA;
0185 branch(:, QT) = imag(St) * baseMVA;
0186
0187
0188 nA = length(u);
0189 neq = length(ieq);
0190 nlt = length(ilt);
0191 ngt = length(igt);
0192 nbx = length(ibx);
0193
0194
0195
0196 inln = [(1:2*nb), (1:2*nl2) + 2*nb+neq];
0197 kl = find(lambda(inln) < 0);
0198 ku = find(lambda(inln) > 0);
0199 nl_mu_l = zeros(2*(nb+nl2), 1);
0200 nl_mu_u = zeros(2*(nb+nl2), 1);
0201 nl_mu_l(kl) = -lambda(inln(kl));
0202 nl_mu_u(ku) = lambda(inln(ku));
0203
0204
0205 ilin = [(1:neq)+2*nb, (1:(nlt+ngt+2*nbx)) + 2*nb+neq+2*nl2];
0206 kl = find(lambda(ilin(1:neq)) < 0);
0207 ku = find(lambda(ilin(1:neq)) > 0);
0208
0209 mu_l = zeros(nA, 1);
0210 mu_l(ieq) = -lambda(ilin(1:neq));
0211 mu_l(ieq(ku)) = 0;
0212 mu_l(igt) = lambda(ilin(neq+nlt+(1:ngt)));
0213 mu_l(ibx) = lambda(ilin(neq+nlt+ngt+nbx+(1:nbx)));
0214
0215 mu_u = zeros(nA, 1);
0216 mu_u(ieq) = lambda(ilin(1:neq));
0217 mu_u(ieq(kl)) = 0;
0218 mu_u(ilt) = lambda(ilin(neq+(1:nlt)));
0219 mu_u(ibx) = lambda(ilin(neq+nlt+ngt+(1:nbx)));
0220
0221
0222 muLB = mu_l(ll.i1.varlims:ll.iN.varlims);
0223 muUB = mu_u(ll.i1.varlims:ll.iN.varlims);
0224 mu_l(ll.i1.varlims:ll.iN.varlims) = [];
0225 mu_u(ll.i1.varlims:ll.iN.varlims) = [];
0226
0227
0228
0229 muSf = zeros(nl, 1);
0230 muSt = zeros(nl, 1);
0231 muSf(il) = 2 * nl_mu_u((1:nl2)+2*nb ) .* branch(il, RATE_A) / baseMVA;
0232 muSt(il) = 2 * nl_mu_u((1:nl2)+2*nb+nl2) .* branch(il, RATE_A) / baseMVA;
0233
0234
0235 nl_mu_l = [nl_mu_l(1:2*nb); zeros(2*nl, 1)];
0236 nl_mu_u = [nl_mu_u(1:2*nb); muSf; muSt];
0237
0238
0239 bus(:, MU_VMAX) = muUB(vv.i1.Vm:vv.iN.Vm);
0240 bus(:, MU_VMIN) = muLB(vv.i1.Vm:vv.iN.Vm);
0241 gen(:, MU_PMAX) = muUB(vv.i1.Pg:vv.iN.Pg) / baseMVA;
0242 gen(:, MU_PMIN) = muLB(vv.i1.Pg:vv.iN.Pg) / baseMVA;
0243 gen(:, MU_QMAX) = muUB(vv.i1.Qg:vv.iN.Qg) / baseMVA;
0244 gen(:, MU_QMIN) = muLB(vv.i1.Qg:vv.iN.Qg) / baseMVA;
0245 bus(:, LAM_P) = (nl_mu_u(nn.i1.Pmis:nn.iN.Pmis) - nl_mu_l(nn.i1.Pmis:nn.iN.Pmis)) / baseMVA;
0246 bus(:, LAM_Q) = (nl_mu_u(nn.i1.Qmis:nn.iN.Qmis) - nl_mu_l(nn.i1.Qmis:nn.iN.Qmis)) / baseMVA;
0247 branch(:, MU_SF) = muSf / baseMVA;
0248 branch(:, MU_ST) = muSt / baseMVA;
0249
0250 mu = struct( ...
0251 'var', struct('l', muLB, 'u', muUB), ...
0252 'nln', struct('l', nl_mu_l, 'u', nl_mu_u), ...
0253 'lin', struct('l', mu_l, 'u', mu_u) );
0254
0255 results = mpc;
0256 [results.bus, results.branch, results.gen, ...
0257 results.om, results.x, results.mu, results.f] = ...
0258 deal(bus, branch, gen, om, x, mu, f);
0259
0260 pimul = [ ...
0261 results.mu.nln.l - results.mu.nln.u;
0262 results.mu.lin.l - results.mu.lin.u;
0263 -ones(ny>0, 1);
0264 results.mu.var.l - results.mu.var.u;
0265 ];
0266 raw = struct('xr', x, 'pimul', pimul, 'info', info);