DSBUS_DV Computes partial derivatives of power injection w.r.t. voltage. [DSBUS_DVM, DSBUS_DVA] = DSBUS_DV(YBUS, V) returns two matrices containing partial derivatives of the complex bus power injections w.r.t voltage magnitude and voltage angle respectively (for all buses). If YBUS is a sparse matrix, the return values will be also. The following explains the expressions used to form the matrices: S = diag(V) * conj(Ibus) = diag(conj(Ibus)) * V Partials of V & Ibus w.r.t. voltage magnitudes dV/dVm = diag(V./abs(V)) dI/dVm = Ybus * dV/dVm = Ybus * diag(V./abs(V)) Partials of V & Ibus w.r.t. voltage angles dV/dVa = j * diag(V) dI/dVa = Ybus * dV/dVa = Ybus * j * diag(V) Partials of S w.r.t. voltage magnitudes dS/dVm = diag(V) * conj(dI/dVm) + diag(conj(Ibus)) * dV/dVm = diag(V) * conj(Ybus * diag(V./abs(V))) + conj(diag(Ibus)) * diag(V./abs(V)) Partials of S w.r.t. voltage angles dS/dVa = diag(V) * conj(dI/dVa) + diag(conj(Ibus)) * dV/dVa = diag(V) * conj(Ybus * j * diag(V)) + conj(diag(Ibus)) * j * diag(V) = -j * diag(V) * conj(Ybus * diag(V)) + conj(diag(Ibus)) * j * diag(V) = j * diag(V) * conj(diag(Ibus) - Ybus * diag(V)) Example: [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch); [dSbus_dVm, dSbus_dVa] = dSbus_dV(Ybus, 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 [dSbus_dVm, dSbus_dVa] = dSbus_dV(Ybus, V) 0002 %DSBUS_DV Computes partial derivatives of power injection w.r.t. voltage. 0003 % [DSBUS_DVM, DSBUS_DVA] = DSBUS_DV(YBUS, V) returns two matrices containing 0004 % partial derivatives of the complex bus power injections w.r.t voltage 0005 % magnitude and voltage angle respectively (for all buses). If YBUS is a 0006 % sparse matrix, the return values will be also. The following explains 0007 % the expressions used to form the matrices: 0008 % 0009 % S = diag(V) * conj(Ibus) = diag(conj(Ibus)) * V 0010 % 0011 % Partials of V & Ibus w.r.t. voltage magnitudes 0012 % dV/dVm = diag(V./abs(V)) 0013 % dI/dVm = Ybus * dV/dVm = Ybus * diag(V./abs(V)) 0014 % 0015 % Partials of V & Ibus w.r.t. voltage angles 0016 % dV/dVa = j * diag(V) 0017 % dI/dVa = Ybus * dV/dVa = Ybus * j * diag(V) 0018 % 0019 % Partials of S w.r.t. voltage magnitudes 0020 % dS/dVm = diag(V) * conj(dI/dVm) + diag(conj(Ibus)) * dV/dVm 0021 % = diag(V) * conj(Ybus * diag(V./abs(V))) 0022 % + conj(diag(Ibus)) * diag(V./abs(V)) 0023 % 0024 % Partials of S w.r.t. voltage angles 0025 % dS/dVa = diag(V) * conj(dI/dVa) + diag(conj(Ibus)) * dV/dVa 0026 % = diag(V) * conj(Ybus * j * diag(V)) 0027 % + conj(diag(Ibus)) * j * diag(V) 0028 % = -j * diag(V) * conj(Ybus * diag(V)) 0029 % + conj(diag(Ibus)) * j * diag(V) 0030 % = j * diag(V) * conj(diag(Ibus) - Ybus * diag(V)) 0031 % 0032 % Example: 0033 % [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch); 0034 % [dSbus_dVm, dSbus_dVa] = dSbus_dV(Ybus, V); 0035 % 0036 % For more details on the derivations behind the derivative code used 0037 % in MATPOWER information, see: 0038 % 0039 % [TN2] R. D. Zimmerman, "AC Power Flows, Generalized OPF Costs and 0040 % their Derivatives using Complex Matrix Notation", MATPOWER 0041 % Technical Note 2, February 2010. 0042 % http://www.pserc.cornell.edu/matpower/TN2-OPF-Derivatives.pdf 0043 0044 % MATPOWER 0045 % Copyright (c) 1996-2016, Power Systems Engineering Research Center (PSERC) 0046 % by Ray Zimmerman, PSERC Cornell 0047 % 0048 % This file is part of MATPOWER. 0049 % Covered by the 3-clause BSD License (see LICENSE file for details). 0050 % See http://www.pserc.cornell.edu/matpower/ for more info. 0051 0052 n = length(V); 0053 Ibus = Ybus * V; 0054 0055 if issparse(Ybus) %% sparse version (if Ybus is sparse) 0056 diagV = sparse(1:n, 1:n, V, n, n); 0057 diagIbus = sparse(1:n, 1:n, Ibus, n, n); 0058 diagVnorm = sparse(1:n, 1:n, V./abs(V), n, n); 0059 else %% dense version 0060 diagV = diag(V); 0061 diagIbus = diag(Ibus); 0062 diagVnorm = diag(V./abs(V)); 0063 end 0064 0065 dSbus_dVm = diagV * conj(Ybus * diagVnorm) + conj(diagIbus) * diagVnorm; 0066 dSbus_dVa = 1j * diagV * conj(diagIbus - Ybus * diagV);