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-2015 by Power System Engineering Research Center (PSERC) 0040 % by Ray Zimmerman, PSERC Cornell 0041 % 0042 % $Id: dIbr_dV.m 2644 2015-03-11 19:34:22Z ray $ 0043 % 0044 % This file is part of MATPOWER. 0045 % Covered by the 3-clause BSD License (see LICENSE file for details). 0046 % See http://www.pserc.cornell.edu/matpower/ for more info. 0047 0048 %% define 0049 nb = length(V); 0050 0051 Vnorm = V ./ abs(V); 0052 if issparse(Yf) %% sparse version (if Yf is sparse) 0053 diagV = sparse(1:nb, 1:nb, V, nb, nb); 0054 diagVnorm = sparse(1:nb, 1:nb, Vnorm, nb, nb); 0055 else %% dense version 0056 diagV = diag(V); 0057 diagVnorm = diag(Vnorm); 0058 end 0059 dIf_dVa = Yf * 1j * diagV; 0060 dIf_dVm = Yf * diagVnorm; 0061 dIt_dVa = Yt * 1j * diagV; 0062 dIt_dVm = Yt * diagVnorm; 0063 0064 %% compute currents 0065 if nargout > 4 0066 If = Yf * V; 0067 It = Yt * V; 0068 end