0001 function [bus, gen, branch] = pfsoln(baseMVA, bus0, gen0, branch0, Ybus, Yf, Yt, V, ref, pv, pq, mpopt)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0016 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0017 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0018 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0019 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0020 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0021 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0022 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0023
0024
0025 if nargin < 12
0026 mpopt = mpoption();
0027 end
0028
0029
0030 bus = bus0;
0031 gen = gen0;
0032 branch = branch0;
0033
0034
0035 bus(:, VM) = abs(V);
0036 bus(:, VA) = angle(V) * 180 / pi;
0037
0038
0039
0040 on = find(gen(:, GEN_STATUS) > 0 & ...
0041 bus(gen(:, GEN_BUS), BUS_TYPE) ~= PQ);
0042 off = find(gen(:, GEN_STATUS) <= 0);
0043 gbus = gen(on, GEN_BUS);
0044
0045
0046 Sbus = V(gbus) .* conj(Ybus(gbus, :) * V);
0047
0048
0049 gen(off, QG) = zeros(length(off), 1);
0050
0051 [Pd_gbus, Qd_gbus] = total_load(bus(gbus, :), [], 'bus', [], mpopt);
0052 gen(on, QG) = imag(Sbus) * baseMVA + Qd_gbus;
0053
0054
0055
0056
0057
0058 if length(on) > 1
0059
0060 nb = size(bus, 1);
0061 ngon = size(on, 1);
0062 Cg = sparse((1:ngon)', gbus, ones(ngon, 1), ngon, nb);
0063
0064
0065 ngg = Cg * sum(Cg)';
0066 gen(on, QG) = gen(on, QG) ./ ngg;
0067
0068
0069
0070 Qmin = gen(on, QMIN);
0071 Qmax = gen(on, QMAX);
0072 M = abs(gen(on, QG));
0073 M(~isinf(Qmax)) = M(~isinf(Qmax)) + abs(Qmax(~isinf(Qmax)));
0074 M(~isinf(Qmin)) = M(~isinf(Qmin)) + abs(Qmin(~isinf(Qmin)));
0075 M = Cg * Cg' * M;
0076
0077 Qmin(Qmin == Inf) = M(Qmin == Inf);
0078 Qmin(Qmin == -Inf) = -M(Qmin == -Inf);
0079 Qmax(Qmax == Inf) = M(Qmax == Inf);
0080 Qmax(Qmax == -Inf) = -M(Qmax == -Inf);
0081
0082
0083 Cmin = sparse((1:ngon)', gbus, Qmin, ngon, nb);
0084 Cmax = sparse((1:ngon)', gbus, Qmax, ngon, nb);
0085 Qg_tot = Cg' * gen(on, QG);
0086 Qg_min = sum(Cmin)';
0087 Qg_max = sum(Cmax)';
0088 gen(on, QG) = Qmin + ...
0089 (Cg * ((Qg_tot - Qg_min)./(Qg_max - Qg_min + eps))) .* ...
0090 (Qmax - Qmin);
0091
0092
0093 ig = find(abs(Cg * (Qg_min - Qg_max)) < 10*eps);
0094 if ~isempty(ig)
0095 ib = find(sum(Cg(ig,:), 1)');
0096
0097 mis = sparse(ib, 1, (Qg_tot(ib) - Qg_min(ib)) ./ sum(Cg(:, ib)', 2), nb, 1);
0098 gen(on(ig), QG) = Qmin(ig) + Cg(ig, :) * mis;
0099 end
0100 end
0101
0102
0103 for k = 1:length(ref)
0104 refgen = find(gbus == ref(k));
0105 Pd_refk = total_load(bus(ref(k), :), [], 'bus', [], mpopt);
0106 gen(on(refgen(1)), PG) = real(Sbus(refgen(1))) * baseMVA + Pd_refk;
0107 if length(refgen) > 1
0108
0109 gen(on(refgen(1)), PG) = gen(on(refgen(1)), PG) ...
0110 - sum(gen(on(refgen(2:length(refgen))), PG));
0111 end
0112 end
0113
0114
0115 out = find(branch(:, BR_STATUS) == 0);
0116 br = find(branch(:, BR_STATUS));
0117 Sf = V(branch(br, F_BUS)) .* conj(Yf(br, :) * V) * baseMVA;
0118 St = V(branch(br, T_BUS)) .* conj(Yt(br, :) * V) * baseMVA;
0119 branch(br, [PF, QF, PT, QT]) = [real(Sf) imag(Sf) real(St) imag(St)];
0120 branch(out, [PF, QF, PT, QT]) = zeros(length(out), 4);