0001 function t_opf_ipopt(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 if have_fcn('octave')
0058 s1 = warning('query', 'Octave:load-file-in-path');
0059 warning('off', 'Octave:load-file-in-path');
0060 end
0061
0062 t0 = 'IPOPT : ';
0063 mpopt = mpoption('opf.violation', 1e-6);
0064 mpopt = mpoption(mpopt, 'out.all', 0, 'verbose', verbose, 'opf.ac.solver', 'IPOPT');
0065
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 ), 2, [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 ), 3, [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 ), 3, [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, success] = runopf(mpc, mpopt);
0103 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0104 t_ok(success, [t 'success']);
0105 t_is(f, f_soln, 3, [t 'f']);
0106 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0107 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0108 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0109 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0110 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0111 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0112 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0113 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0114 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0115 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0116 xr = [r.var.val.Va;r.var.val.Vm;r.var.val.Pg;r.var.val.Qg;0;r.var.val.y];
0117 t_is(r.x, xr, 8, [t 'check on raw x returned from OPF']);
0118
0119
0120 load soln9_opf_Plim;
0121
0122
0123 t = [t0 '(P line lim) : '];
0124 mpopt1 = mpoption(mpopt, 'opf.flow_lim', 'P');
0125 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(casefile, mpopt1);
0126 t_ok(success, [t 'success']);
0127 t_is(f, f_soln, 3, [t 'f']);
0128 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0129 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0130 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0131 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0132 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0133 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0134 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0135 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0136 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0137 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0138
0139
0140 mpc = loadcase(casefile);
0141 mpc.gencost = [
0142 2 1500 0 3 0.11 5 0;
0143 2 2000 0 3 0.085 1.2 0;
0144 2 3000 0 3 0.1225 1 0;
0145 ];
0146 [baseMVA, bus_soln, gen_soln, gencost, branch_soln, f_soln, success, et] = runopf(mpc, mpopt);
0147 branch_soln = branch_soln(:,1:MU_ST);
0148
0149 A = sparse(0,0);
0150 l = [];
0151 u = [];
0152 nb = size(mpc.bus, 1);
0153 ng = size(mpc.gen, 1);
0154 thbas = 1; thend = thbas+nb-1;
0155 vbas = thend+1; vend = vbas+nb-1;
0156 pgbas = vend+1; pgend = pgbas+ng-1;
0157 qgbas = pgend+1; qgend = qgbas+ng-1;
0158 nxyz = 2*nb + 2*ng;
0159 N = sparse((1:ng)', (pgbas:pgend)', mpc.baseMVA * ones(ng,1), ng, nxyz);
0160 fparm = ones(ng,1) * [ 1 0 0 1 ];
0161 [junk, ix] = sort(mpc.gen(:, 1));
0162 H = 2 * spdiags(mpc.gencost(ix, 5), 0, ng, ng);
0163 Cw = mpc.gencost(ix, 6);
0164 mpc.gencost(:, 5:7) = 0;
0165
0166
0167 t = [t0 'w/quadratic generalized gen cost : '];
0168 [r, success] = opf(mpc, A, l, u, mpopt, N, fparm, H, Cw);
0169 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0170 t_ok(success, [t 'success']);
0171 t_is(f, f_soln, 3, [t 'f']);
0172 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0173 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0174 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0175 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0176 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0177 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0178 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0179 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0180 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0181 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0182 t_is(r.cost.usr, f, 12, [t 'user cost']);
0183
0184
0185
0186
0187
0188 load soln9_opf_extras1;
0189 A = sparse([1;1;2;2],[10;25;10;25],[-1;1;1;1],2,25);
0190 u = [Inf; Inf];
0191 l = [-1; 1];
0192
0193 N = sparse(1, 25, 1, 1, 25);
0194 fparm = [1 0 0 1];
0195 H = sparse(1,1);
0196 Cw = 100;
0197
0198 t = [t0 'w/extra constraints & costs 1 : '];
0199 [r, success] = opf(casefile, A, l, u, mpopt, N, fparm, H, Cw);
0200 [f, bus, gen, branch] = deal(r.f, r.bus, r.gen, r.branch);
0201 t_ok(success, [t 'success']);
0202 t_is(f, f_soln, 3, [t 'f']);
0203 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0204 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0205 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0206 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0207 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0208 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0209 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0210 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0211 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0212 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0213 t_is(r.var.val.z, 0.025419, 6, [t 'user variable']);
0214 t_is(r.cost.usr, 2.5419, 4, [t 'user cost']);
0215
0216
0217 mpc = loadcase('t_case9_opfv2');
0218
0219 mpc.branch(1, ANGMAX) = 360;
0220 mpc.branch(9, ANGMIN) = -360;
0221
0222
0223 load soln9_opf_PQcap;
0224
0225
0226 t = [t0 'w/capability curves : '];
0227 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0228 t_ok(success, [t 'success']);
0229 t_is(f, f_soln, 3, [t 'f']);
0230 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0231 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0232 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0233 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0234 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0235 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0236 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0237 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0238 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0239 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0240
0241
0242 mpc = loadcase('t_case9_opfv2');
0243
0244 mpc.gen(2:3, [PC1, PC2, QC1MIN, QC1MAX, QC2MIN, QC2MAX]) = zeros(2,6);
0245
0246
0247 load soln9_opf_ang;
0248
0249
0250 t = [t0 'w/angle difference limits : '];
0251 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt);
0252 t_ok(success, [t 'success']);
0253 t_is(f, f_soln, 3, [t 'f']);
0254 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0255 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0256 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0257 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 1, [t 'bus mu']);
0258 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0259 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0260 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0261 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0262 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0263 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0264 t_is(branch(:,ibr_angmu ), branch_soln(:,ibr_angmu ), 2, [t 'branch angle mu']);
0265
0266
0267
0268 load soln9_opf;
0269
0270
0271 t = [t0 'w/ignored angle difference limits : '];
0272 mpopt1 = mpoption(mpopt, 'opf.ignore_angle_lim', 1);
0273 [baseMVA, bus, gen, gencost, branch, f, success, et] = runopf(mpc, mpopt1);
0274
0275 branch(1, ANGMAX) = 360;
0276 branch(9, ANGMIN) = -360;
0277 t_ok(success, [t 'success']);
0278 t_is(f, f_soln, 3, [t 'f']);
0279 t_is( bus(:,ib_data ), bus_soln(:,ib_data ), 10, [t 'bus data']);
0280 t_is( bus(:,ib_voltage), bus_soln(:,ib_voltage), 3, [t 'bus voltage']);
0281 t_is( bus(:,ib_lam ), bus_soln(:,ib_lam ), 3, [t 'bus lambda']);
0282 t_is( bus(:,ib_mu ), bus_soln(:,ib_mu ), 2, [t 'bus mu']);
0283 t_is( gen(:,ig_data ), gen_soln(:,ig_data ), 10, [t 'gen data']);
0284 t_is( gen(:,ig_disp ), gen_soln(:,ig_disp ), 3, [t 'gen dispatch']);
0285 t_is( gen(:,ig_mu ), gen_soln(:,ig_mu ), 3, [t 'gen mu']);
0286 t_is(branch(:,ibr_data ), branch_soln(:,ibr_data ), 10, [t 'branch data']);
0287 t_is(branch(:,ibr_flow ), branch_soln(:,ibr_flow ), 3, [t 'branch flow']);
0288 t_is(branch(:,ibr_mu ), branch_soln(:,ibr_mu ), 2, [t 'branch mu']);
0289
0290 if have_fcn('octave')
0291 warning(s1.state, 'Octave:load-file-in-path');
0292 end
0293
0294 t_end;