DIBR_DV Computes partial derivatives of branch currents w.r.t. voltage. [DIF_DVA, DIF_DVM, DIT_DVA, DIT_DVM, IF, IT] = DIBR_DV(BRANCH, YF, YT, V) returns four matrices containing partial derivatives of the complex branch currents at "from" and "to" ends of each branch w.r.t voltage magnitude and voltage angle respectively (for all buses). If YF is a sparse matrix, the partial derivative matrices will be as well. Optionally returns vectors containing the currents themselves. The following explains the expressions used to form the matrices: If = Yf * V; Partials of V, Vf & If w.r.t. voltage angles dV/dVa = j * diag(V) dVf/dVa = sparse(1:nl, f, j * V(f)) = j * sparse(1:nl, f, V(f)) dIf/dVa = Yf * dV/dVa = Yf * j * diag(V) Partials of V, Vf & If w.r.t. voltage magnitudes dV/dVm = diag(V./abs(V)) dVf/dVm = sparse(1:nl, f, V(f)./abs(V(f)) dIf/dVm = Yf * dV/dVm = Yf * diag(V./abs(V)) Derivations for "to" bus are similar. Example: [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch); [dIf_dVa, dIf_dVm, dIt_dVa, dIt_dVm, If, It] = ... dIbr_dV(branch, Yf, Yt, V); For more details on the derivations behind the derivative code used in MATPOWER information, see: [TN2] R. D. Zimmerman, "AC Power Flows, Generalized OPF Costs and their Derivatives using Complex Matrix Notation", MATPOWER Technical Note 2, February 2010. http://www.pserc.cornell.edu/matpower/TN2-OPF-Derivatives.pdf
0001 function [dIf_dVa, dIf_dVm, dIt_dVa, dIt_dVm, If, It] = dIbr_dV(branch, Yf, Yt, V) 0002 %DIBR_DV Computes partial derivatives of branch currents w.r.t. voltage. 0003 % [DIF_DVA, DIF_DVM, DIT_DVA, DIT_DVM, IF, IT] = DIBR_DV(BRANCH, YF, YT, V) 0004 % returns four matrices containing partial derivatives of the complex 0005 % branch currents at "from" and "to" ends of each branch w.r.t voltage 0006 % magnitude and voltage angle respectively (for all buses). If YF is a 0007 % sparse matrix, the partial derivative matrices will be as well. Optionally 0008 % returns vectors containing the currents themselves. The following 0009 % explains the expressions used to form the matrices: 0010 % 0011 % If = Yf * V; 0012 % 0013 % Partials of V, Vf & If w.r.t. voltage angles 0014 % dV/dVa = j * diag(V) 0015 % dVf/dVa = sparse(1:nl, f, j * V(f)) = j * sparse(1:nl, f, V(f)) 0016 % dIf/dVa = Yf * dV/dVa = Yf * j * diag(V) 0017 % 0018 % Partials of V, Vf & If w.r.t. voltage magnitudes 0019 % dV/dVm = diag(V./abs(V)) 0020 % dVf/dVm = sparse(1:nl, f, V(f)./abs(V(f)) 0021 % dIf/dVm = Yf * dV/dVm = Yf * diag(V./abs(V)) 0022 % 0023 % Derivations for "to" bus are similar. 0024 % 0025 % Example: 0026 % [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch); 0027 % [dIf_dVa, dIf_dVm, dIt_dVa, dIt_dVm, If, It] = ... 0028 % dIbr_dV(branch, Yf, Yt, V); 0029 % 0030 % For more details on the derivations behind the derivative code used 0031 % in MATPOWER information, see: 0032 % 0033 % [TN2] R. D. Zimmerman, "AC Power Flows, Generalized OPF Costs and 0034 % their Derivatives using Complex Matrix Notation", MATPOWER 0035 % Technical Note 2, February 2010. 0036 % http://www.pserc.cornell.edu/matpower/TN2-OPF-Derivatives.pdf 0037 0038 % MATPOWER 0039 % Copyright (c) 1996-2016, Power Systems Engineering Research Center (PSERC) 0040 % by Ray Zimmerman, PSERC Cornell 0041 % 0042 % This file is part of MATPOWER. 0043 % Covered by the 3-clause BSD License (see LICENSE file for details). 0044 % See http://www.pserc.cornell.edu/matpower/ for more info. 0045 0046 %% define 0047 nb = length(V); 0048 0049 Vnorm = V ./ abs(V); 0050 if issparse(Yf) %% sparse version (if Yf is sparse) 0051 diagV = sparse(1:nb, 1:nb, V, nb, nb); 0052 diagVnorm = sparse(1:nb, 1:nb, Vnorm, nb, nb); 0053 else %% dense version 0054 diagV = diag(V); 0055 diagVnorm = diag(Vnorm); 0056 end 0057 dIf_dVa = Yf * 1j * diagV; 0058 dIf_dVm = Yf * diagVnorm; 0059 dIt_dVa = Yt * 1j * diagV; 0060 dIt_dVm = Yt * diagVnorm; 0061 0062 %% compute currents 0063 if nargout > 4 0064 If = Yf * V; 0065 It = Yt * V; 0066 end