0001 function t_opf_lp_spf(quiet)
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 if nargin < 1
0037 quiet = 0;
0038 end
0039
0040 num_tests = 101;
0041
0042 t_begin(num_tests, quiet);
0043
0044 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0045 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0046 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0047 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0048 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0049 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0050 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0051 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0052 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0053
0054 casefile = 't_case9_opf';
0055 if quiet
0056 verbose = 0;
0057 else
0058 verbose = 0;
0059 end
0060
0061 t0 = 'sparse (full) LP-based OPF : ';
0062 mpopt = mpoption('OPF_VIOLATION', 1e-6, 'LPC_TOL_X', 1e-5, 'LPC_TOL_GRAD', 1e-5);
0063 mpopt = mpoption(mpopt, 'OUT_ALL', 0, 'VERBOSE', verbose, 'OPF_ALG', 360);
0064
0065 if have_fcn('bpmpd')
0066
0067 ib_data = [1:BUS_AREA BASE_KV:VMIN];
0068 ib_voltage = [VM VA];
0069 ib_lam = [LAM_P LAM_Q];
0070 ib_mu = [MU_VMAX MU_VMIN];
0071 ig_data = [GEN_BUS QMAX QMIN MBASE:APF];
0072 ig_disp = [PG QG VG];
0073 ig_mu = (MU_PMAX:MU_QMIN);
0074 ibr_data = (1:ANGMAX);
0075 ibr_flow = (PF:QT);
0076 ibr_mu = [MU_SF MU_ST];
0077 ibr_angmu = [MU_ANGMIN MU_ANGMAX];
0078
0079
0080 load soln9_opf;
0081
0082
0083 t = t0;
0084 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(casefile, mpopt);
0085 t_ok(success, [t 'success']);
0086 t_is(f, f_soln, 3, [t 'f']);
0087 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0088 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0089 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0090 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0091 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0092 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 2, [t 'gen dispatch']);
0093 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0094 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0095 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 2, [t 'branch flow']);
0096 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0097
0098
0099 t = [t0 '(single-block PWL) : '];
0100 mpc = loadcase(casefile);
0101 mpc.gencost(3, NCOST) = 2;
0102 r = runopf(mpc, mpopt);
0103 t_ok(success, [t 'success']);
0104 t_is(f, f_soln, 3, [t 'f']);
0105 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0106 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0107 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0108 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0109 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0110 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0111 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0112 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0113 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0114 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0115 xr = [r.var.val.Va;r.var.val.Vm;r.var.val.Pg;r.var.val.Qg;0;r.var.val.y];
0116 t_is(r.x, xr, 8, [t 'check on raw x returned from OPF']);
0117
0118
0119 load soln9_opf_Plim;
0120
0121
0122 t = [t0 '(P line lim) : '];
0123 mpopt1 = mpoption(mpopt, 'OPF_FLOW_LIM', 1);
0124 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(casefile, mpopt1);
0125 t_ok(success, [t 'success']);
0126 t_is(f, f_soln, 3, [t 'f']);
0127 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0128 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0129 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0130 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0131 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0132 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0133 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0134 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0135 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0136 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0137
0138
0139 mpc = loadcase(casefile);
0140 mpc.gencost = [
0141 2 1500 0 3 0.11 5 0;
0142 2 2000 0 3 0.085 1.2 0;
0143 2 3000 0 3 0.1225 1 0;
0144 ];
0145 [baseMVA, bus_soln, gen_soln, gencost, branch_soln, f_soln, success, et] = runopf(mpc, mpopt);
0146 branch_soln = branch_soln(:,1:MU_ST);
0147
0148 A = sparse(0,0);
0149 l = [];
0150 u = [];
0151 nb = size(mpc.bus, 1);
0152 ng = size(mpc.gen, 1);
0153 thbas = 1; thend = thbas+nb-1;
0154 vbas = thend+1; vend = vbas+nb-1;
0155 pgbas = vend+1; pgend = pgbas+ng-1;
0156 qgbas = pgend+1; qgend = qgbas+ng-1;
0157 nxyz = 2*nb + 2*ng;
0158 N = sparse((1:ng)', (pgbas:pgend)', mpc.baseMVA * ones(ng,1), ng, nxyz);
0159 fparm = ones(ng,1) * [ 1 0 0 1 ];
0160 [junk, ix] = sort(mpc.gen(:, 1));
0161 H = 2 * spdiags(mpc.gencost(ix, 5), 0, ng, ng);
0162 Cw = mpc.gencost(ix, 6);
0163 mpc.gencost(:, 5:7) = 0;
0164
0165
0166 t = [t0 'w/quadratic generalized gen cost : '];
0167 [r, success] = opf(mpc, A, l, u, mpopt, N, fparm, H, Cw);
0168 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0169 t_ok(success, [t 'success']);
0170 t_is(f, f_soln, 3, [t 'f']);
0171 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0172 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0173 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0174 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0175 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0176 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0177 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0178 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0179 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0180 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0181 t_is(r.cost.usr, f, 12, [t 'user cost']);
0182
0183
0184
0185
0186
0187 load soln9_opf_extras1;
0188 A = sparse([1;1;2;2],[10;25;10;25],[-1;1;1;1],2,25);
0189 u = [Inf; Inf];
0190 l = [-1; 1];
0191
0192 N = sparse(1, 25, 1, 1, 25);
0193 fparm = [1 0 0 1];
0194 H = sparse(1,1);
0195 Cw = 100;
0196
0197 t = [t0 'w/extra constraints & costs 1 : '];
0198 [r, success] = opf(casefile, A, l, u, mpopt, N, fparm, H, Cw);
0199 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0200 t_ok(success, [t 'success']);
0201 t_is(f, f_soln, 3, [t 'f']);
0202 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0203 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 2, [t 'bus voltage']);
0204 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 2, [t 'bus lambda']);
0205 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0206 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0207 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 1, [t 'gen dispatch']);
0208 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0209 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0210 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 1, [t 'branch flow']);
0211 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0212 t_is(r.var.val.z, 0.025419, 4, [t 'user variable']);
0213 t_is(r.cost.usr, 2.5419, 2, [t 'user cost']);
0214
0215
0216 mpc = loadcase('t_case9_opfv2');
0217
0218 mpc.branch(1, ANGMAX) = 360;
0219 mpc.branch(9, ANGMIN) = -360;
0220
0221
0222 load soln9_opf_PQcap;
0223
0224
0225 t = [t0 'w/capability curves : '];
0226 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0227 t_ok(success, [t 'success']);
0228 t_is(f, f_soln, 3, [t 'f']);
0229 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0230 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0231 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0232 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0233 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0234 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0235 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0236 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0237 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0238 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0239
0240
0241 mpc = loadcase('t_case9_opfv2');
0242
0243 mpc.gen(2:3, [PC1, PC2, QC1MIN, QC1MAX, QC2MIN, QC2MAX]) = zeros(2,6);
0244
0245
0246 load soln9_opf_ang;
0247
0248
0249 t = [t0 'w/angle difference limits : '];
0250 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0251 t_ok(success, [t 'success']);
0252 t_is(f, f_soln, 3, [t 'f']);
0253 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0254 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0255 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0256 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0257 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0258 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0259 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0260 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0261 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0262 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0263 t_is(branch(:,ibr_angmu ), branch_soln(:,ibr_angmu ), 2, [t 'branch angle mu']);
0264
0265
0266
0267 load soln9_opf;
0268
0269
0270 t = [t0 'w/ignored angle difference limits : '];
0271 mpopt1 = mpoption(mpopt, 'OPF_IGNORE_ANG_LIM', 1);
0272 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt1);
0273
0274 branch(1, ANGMAX) = 360;
0275 branch(9, ANGMIN) = -360;
0276 t_ok(success, [t 'success']);
0277 t_is(f, f_soln, 3, [t 'f']);
0278 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0279 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0280 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0281 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0282 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0283 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 2, [t 'gen dispatch']);
0284 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0285 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0286 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 2, [t 'branch flow']);
0287 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0288 else
0289 t_skip(num_tests, 'BPMPD_MEX not available');
0290 end
0291
0292 t_end;