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