FDPF Solves the power flow using a fast decoupled method. [V, CONVERGED, I] = FDPF(YBUS, SBUS, V0, BP, BPP, REF, PV, PQ, MPOPT) solves for bus voltages given the full system admittance matrix (for all buses), the complex bus power injection vector (for all buses), the initial vector of complex bus voltages, the FDPF matrices B prime and B double prime, and column vectors with the lists of bus indices for the swing bus, PV buses, and PQ buses, respectively. The bus voltage vector contains the set point for generator (including ref bus) buses, and the reference angle of the swing bus, as well as an initial guess for remaining magnitudes and angles. MPOPT is a MATPOWER options vector which can be used to set the termination tolerance, maximum number of iterations, and output options (see MPOPTION for details). Uses default options if this parameter is not given. Returns the final complex voltages, a flag which indicates whether it converged or not, and the number of iterations performed. See also RUNPF.
0001 function [V, converged, i] = fdpf(Ybus, Sbus, V0, Bp, Bpp, ref, pv, pq, mpopt) 0002 %FDPF Solves the power flow using a fast decoupled method. 0003 % [V, CONVERGED, I] = FDPF(YBUS, SBUS, V0, BP, BPP, REF, PV, PQ, MPOPT) 0004 % solves for bus voltages given the full system admittance matrix (for 0005 % all buses), the complex bus power injection vector (for all buses), 0006 % the initial vector of complex bus voltages, the FDPF matrices B prime 0007 % and B double prime, and column vectors with the lists of bus indices 0008 % for the swing bus, PV buses, and PQ buses, respectively. The bus voltage 0009 % vector contains the set point for generator (including ref bus) 0010 % buses, and the reference angle of the swing bus, as well as an initial 0011 % guess for remaining magnitudes and angles. MPOPT is a MATPOWER options 0012 % vector which can be used to set the termination tolerance, maximum 0013 % number of iterations, and output options (see MPOPTION for details). 0014 % Uses default options if this parameter is not given. Returns the 0015 % final complex voltages, a flag which indicates whether it converged 0016 % or not, and the number of iterations performed. 0017 % 0018 % See also RUNPF. 0019 0020 % MATPOWER 0021 % $Id: fdpf.m,v 1.14 2011/12/14 17:05:18 cvs Exp $ 0022 % by Ray Zimmerman, PSERC Cornell 0023 % Copyright (c) 1996-2011 by Power System Engineering Research Center (PSERC) 0024 % 0025 % This file is part of MATPOWER. 0026 % See http://www.pserc.cornell.edu/matpower/ for more info. 0027 % 0028 % MATPOWER is free software: you can redistribute it and/or modify 0029 % it under the terms of the GNU General Public License as published 0030 % by the Free Software Foundation, either version 3 of the License, 0031 % or (at your option) any later version. 0032 % 0033 % MATPOWER is distributed in the hope that it will be useful, 0034 % but WITHOUT ANY WARRANTY; without even the implied warranty of 0035 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0036 % GNU General Public License for more details. 0037 % 0038 % You should have received a copy of the GNU General Public License 0039 % along with MATPOWER. If not, see <http://www.gnu.org/licenses/>. 0040 % 0041 % Additional permission under GNU GPL version 3 section 7 0042 % 0043 % If you modify MATPOWER, or any covered work, to interface with 0044 % other modules (such as MATLAB code and MEX-files) available in a 0045 % MATLAB(R) or comparable environment containing parts covered 0046 % under other licensing terms, the licensors of MATPOWER grant 0047 % you additional permission to convey the resulting work. 0048 0049 %% default arguments 0050 if nargin < 7 0051 mpopt = mpoption; 0052 end 0053 0054 %% options 0055 tol = mpopt(2); 0056 max_it = mpopt(4); 0057 verbose = mpopt(31); 0058 0059 %% initialize 0060 converged = 0; 0061 i = 0; 0062 V = V0; 0063 Va = angle(V); 0064 Vm = abs(V); 0065 0066 %% set up indexing for updating V 0067 npv = length(pv); 0068 npq = length(pq); 0069 0070 %% evaluate initial mismatch 0071 mis = (V .* conj(Ybus * V) - Sbus) ./ Vm; 0072 P = real(mis([pv; pq])); 0073 Q = imag(mis(pq)); 0074 0075 %% check tolerance 0076 normP = norm(P, inf); 0077 normQ = norm(Q, inf); 0078 if verbose > 1 0079 fprintf('\niteration max mismatch (p.u.) '); 0080 fprintf('\ntype # P Q '); 0081 fprintf('\n---- ---- ----------- -----------'); 0082 fprintf('\n - %3d %10.3e %10.3e', i, normP, normQ); 0083 end 0084 if normP < tol && normQ < tol 0085 converged = 1; 0086 if verbose > 1 0087 fprintf('\nConverged!\n'); 0088 end 0089 end 0090 0091 %% reduce B matrices 0092 Bp = Bp([pv; pq], [pv; pq]); 0093 Bpp = Bpp(pq, pq); 0094 0095 %% factor B matrices 0096 [Lp, Up, Pp] = lu(Bp); 0097 [Lpp, Upp, Ppp] = lu(Bpp); 0098 0099 %% do P and Q iterations 0100 while (~converged && i < max_it) 0101 %% update iteration counter 0102 i = i + 1; 0103 0104 %%----- do P iteration, update Va ----- 0105 dVa = -( Up \ (Lp \ (Pp * P))); 0106 0107 %% update voltage 0108 Va([pv; pq]) = Va([pv; pq]) + dVa; 0109 V = Vm .* exp(1j * Va); 0110 0111 %% evalute mismatch 0112 mis = (V .* conj(Ybus * V) - Sbus) ./ Vm; 0113 P = real(mis([pv; pq])); 0114 Q = imag(mis(pq)); 0115 0116 %% check tolerance 0117 normP = norm(P, inf); 0118 normQ = norm(Q, inf); 0119 if verbose > 1 0120 fprintf('\n P %3d %10.3e %10.3e', i, normP, normQ); 0121 end 0122 if normP < tol && normQ < tol 0123 converged = 1; 0124 if verbose 0125 fprintf('\nFast-decoupled power flow converged in %d P-iterations and %d Q-iterations.\n', i, i-1); 0126 end 0127 break; 0128 end 0129 0130 %%----- do Q iteration, update Vm ----- 0131 dVm = -( Upp \ (Lpp \ (Ppp * Q)) ); 0132 0133 %% update voltage 0134 Vm(pq) = Vm(pq) + dVm; 0135 V = Vm .* exp(1j * Va); 0136 0137 %% evalute mismatch 0138 mis = (V .* conj(Ybus * V) - Sbus) ./ Vm; 0139 P = real(mis([pv; pq])); 0140 Q = imag(mis(pq)); 0141 0142 %% check tolerance 0143 normP = norm(P, inf); 0144 normQ = norm(Q, inf); 0145 if verbose > 1 0146 fprintf('\n Q %3d %10.3e %10.3e', i, normP, normQ); 0147 end 0148 if normP < tol && normQ < tol 0149 converged = 1; 0150 if verbose 0151 fprintf('\nFast-decoupled power flow converged in %d P-iterations and %d Q-iterations.\n', i, i); 0152 end 0153 break; 0154 end 0155 end 0156 0157 if verbose 0158 if ~converged 0159 fprintf('\nFast-decoupled power flow did not converge in %d iterations.\n', i); 0160 end 0161 end