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, 'fmincon.tol_x', 1e-6, 'fmincon.tol_f', 1e-9);
0060 mpopt = mpoption(mpopt, 'out.all', 0, 'verbose', verbose, 'opf.ac.solver', 'FMINCON');
0061
0062
0063 v = ver('Matlab');
0064 if strcmp(v.Version, '7.6') || strcmp(v.Version, '7.7') || ...
0065 strcmp(v.Version, '7.8') || strcmp(v.Version, '7.9')
0066 mpopt = mpoption(mpopt, 'fmincon.alg', 1);
0067 end
0068
0069 if have_fcn('fmincon')
0070
0071 ib_data = [1:BUS_AREA BASE_KV:VMIN];
0072 ib_voltage = [VM VA];
0073 ib_lam = [LAM_P LAM_Q];
0074 ib_mu = [MU_VMAX MU_VMIN];
0075 ig_data = [GEN_BUS QMAX QMIN MBASE:APF];
0076 ig_disp = [PG QG VG];
0077 ig_mu = (MU_PMAX:MU_QMIN);
0078 ibr_data = (1:ANGMAX);
0079 ibr_flow = (PF:QT);
0080 ibr_mu = [MU_SF MU_ST];
0081 ibr_angmu = [MU_ANGMIN MU_ANGMAX];
0082
0083
0084 load soln9_opf;
0085
0086
0087 t = t0;
0088 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(casefile, mpopt);
0089 t_ok(success, [t 'success']);
0090 t_is(f, f_soln, 3, [t 'f']);
0091 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0092 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0093 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0094 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0095 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0096 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0097 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0098 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0099 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0100 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0101
0102
0103 t = [t0 '(single-block PWL) : '];
0104 mpc = loadcase(casefile);
0105 mpc.gencost(3, NCOST) = 2;
0106 [r, success] = runopf(mpc, mpopt);
0107 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0108 t_ok(success, [t 'success']);
0109 t_is(f, f_soln, 3, [t 'f']);
0110 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0111 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0112 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0113 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0114 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0115 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0116 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0117 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0118 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0119 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0120 xr = [r.var.val.Va;r.var.val.Vm;r.var.val.Pg;r.var.val.Qg;0;r.var.val.y];
0121 t_is(r.x, xr, 8, [t 'check on raw x returned from OPF']);
0122
0123
0124 load soln9_opf_Plim;
0125
0126
0127 t = [t0 '(P line lim) : '];
0128 mpopt1 = mpoption(mpopt, 'opf.flow_lim', 'P');
0129 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(casefile, mpopt1);
0130 t_ok(success, [t 'success']);
0131 t_is(f, f_soln, 3, [t 'f']);
0132 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0133 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0134 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0135 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0136 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0137 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0138 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0139 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0140 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0141 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0142
0143
0144 mpc = loadcase(casefile);
0145 mpc.gencost = [
0146 2 1500 0 3 0.11 5 0;
0147 2 2000 0 3 0.085 1.2 0;
0148 2 3000 0 3 0.1225 1 0;
0149 ];
0150 [baseMVA, bus_soln, gen_soln, gencost, branch_soln, f_soln, success, et] = runopf(mpc, mpopt);
0151 branch_soln = branch_soln(:,1:MU_ST);
0152
0153 A = sparse(0,0);
0154 l = [];
0155 u = [];
0156 nb = size(mpc.bus, 1);
0157 ng = size(mpc.gen, 1);
0158 thbas = 1; thend = thbas+nb-1;
0159 vbas = thend+1; vend = vbas+nb-1;
0160 pgbas = vend+1; pgend = pgbas+ng-1;
0161 qgbas = pgend+1; qgend = qgbas+ng-1;
0162 nxyz = 2*nb + 2*ng;
0163 N = sparse((1:ng)', (pgbas:pgend)', mpc.baseMVA * ones(ng,1), ng, nxyz);
0164 fparm = ones(ng,1) * [ 1 0 0 1 ];
0165 [junk, ix] = sort(mpc.gen(:, 1));
0166 H = 2 * spdiags(mpc.gencost(ix, 5), 0, ng, ng);
0167 Cw = mpc.gencost(ix, 6);
0168 mpc.gencost(:, 5:7) = 0;
0169
0170
0171 t = [t0 'w/quadratic generalized gen cost : '];
0172 [r, success] = opf(mpc, A, l, u, mpopt, N, fparm, H, Cw);
0173 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0174 t_ok(success, [t 'success']);
0175 t_is(f, f_soln, 3, [t 'f']);
0176 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0177 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0178 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0179 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0180 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0181 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0182 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0183 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0184 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0185 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0186 t_is(r.cost.usr, f, 12, [t 'user cost']);
0187
0188
0189
0190
0191
0192 load soln9_opf_extras1;
0193 A = sparse([1;1;2;2],[10;25;10;25],[-1;1;1;1],2,25);
0194 u = [Inf; Inf];
0195 l = [-1; 1];
0196
0197 N = sparse(1, 25, 1, 1, 25);
0198 fparm = [1 0 0 1];
0199 H = sparse(1,1);
0200 Cw = 100;
0201
0202 t = [t0 'w/extra constraints & costs 1 : '];
0203 [r, success] = opf(casefile, A, l, u, mpopt, N, fparm, H, Cw);
0204 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0205 t_ok(success, [t 'success']);
0206 t_is(f, f_soln, 3, [t 'f']);
0207 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0208 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0209 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 2, [t 'bus lambda']);
0210 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0211 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0212 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0213 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0214 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0215 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0216 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0217 t_is(r.var.val.z, 0.025419, 6, [t 'user variable']);
0218 t_is(r.cost.usr, 2.5419, 4, [t 'user cost']);
0219
0220
0221 mpc = loadcase('t_case9_opfv2');
0222
0223 mpc.branch(1, ANGMAX) = 360;
0224 mpc.branch(9, ANGMIN) = -360;
0225
0226
0227 load soln9_opf_PQcap;
0228
0229
0230 t = [t0 'w/capability curves : '];
0231 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0232 t_ok(success, [t 'success']);
0233 t_is(f, f_soln, 3, [t 'f']);
0234 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0235 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0236 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0237 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0238 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0239 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0240 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0241 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0242 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0243 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0244
0245
0246 mpc = loadcase('t_case9_opfv2');
0247
0248 mpc.gen(2:3, [PC1, PC2, QC1MIN, QC1MAX, QC2MIN, QC2MAX]) = zeros(2,6);
0249
0250
0251 load soln9_opf_ang;
0252
0253
0254 t = [t0 'w/angle difference limits : '];
0255 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0256 t_ok(success, [t 'success']);
0257 t_is(f, f_soln, 3, [t 'f']);
0258 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0259 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0260 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0261 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0262 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0263 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0264 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0265 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0266 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0267 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0268 t_is(branch(:,ibr_angmu ), branch_soln(:,ibr_angmu ), 2, [t 'branch angle mu']);
0269
0270
0271
0272 load soln9_opf;
0273
0274
0275 t = [t0 'w/ignored angle difference limits : '];
0276 mpopt1 = mpoption(mpopt, 'opf.ignore_angle_lim', 1);
0277 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt1);
0278
0279 branch(1, ANGMAX) = 360;
0280 branch(9, ANGMIN) = -360;
0281 t_ok(success, [t 'success']);
0282 t_is(f, f_soln, 3, [t 'f']);
0283 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0284 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0285 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0286 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0287 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0288 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0289 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0290 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0291 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0292 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0293 else
0294 t_skip(num_tests, 'fmincon not available');
0295 end
0296
0297 t_end;