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