DABR_DV Partial derivatives of squared flow magnitudes w.r.t voltage. [DAF_DV1, DAF_DV2, DAT_DV1, DAT_DV2] = ... DABR_DV(DFF_DV1, DFF_DV2, DFT_DV1, DFT_DV2, FF, FT) returns four matrices containing partial derivatives of the square of the branch flow magnitudes at "from" & "to" ends of each branch w.r.t voltage components (either angle and magnitude, respectively, if polar, or real and imaginary, respectively, if cartesian) for all buses, given the flows and flow sensitivities. Flows could be complex current or complex or real power. Notation below is based on complex power. The following explains the expressions used to form the matrices: Let Af refer to the square of the apparent power at the "from" end of each branch, Af = abs(Sf).^2 = Sf .* conj(Sf) = Pf.^2 + Qf.^2 then ... Partial w.r.t real power, dAf/dPf = 2 * diag(Pf) Partial w.r.t reactive power, dAf/dQf = 2 * diag(Qf) Partial w.r.t V1 & V2 (e.g. Va and Vm, or Vr and Vi) dAf/dV1 = dAf/dPf * dPf/dV1 + dAf/dQf * dQf/dV1 dAf/dV2 = dAf/dPf * dPf/dV2 + dAf/dQf * dQf/dV2 Derivations for "to" bus are similar. Examples: %% squared current magnitude [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... dIbr_dV(branch(il,:), Yf, Yt, V); [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); %% squared apparent power flow [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... dSbr_dV(branch(il,:), Yf, Yt, V); [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); %% squared real power flow [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... dSbr_dV(branch(il,:), Yf, Yt, V); dFf_dV1 = real(dFf_dV1); dFf_dV2 = real(dFf_dV2); dFt_dV1 = real(dFt_dV1); dFt_dV2 = real(dFt_dV2); [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); See also DIBR_DV, DSBR_DV. 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. [Online]. Available: https://matpower.org/docs/TN2-OPF-Derivatives.pdf doi: 10.5281/zenodo.3237866
0001 function [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... 0002 dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft) 0003 %DABR_DV Partial derivatives of squared flow magnitudes w.r.t voltage. 0004 % [DAF_DV1, DAF_DV2, DAT_DV1, DAT_DV2] = ... 0005 % DABR_DV(DFF_DV1, DFF_DV2, DFT_DV1, DFT_DV2, FF, FT) 0006 % returns four matrices containing partial derivatives of the square of 0007 % the branch flow magnitudes at "from" & "to" ends of each branch w.r.t 0008 % voltage components (either angle and magnitude, respectively, if polar, 0009 % or real and imaginary, respectively, if cartesian) for all buses, given 0010 % the flows and flow sensitivities. Flows could be complex current or 0011 % complex or real power. Notation below is based on complex power. The 0012 % following explains the expressions used to form the matrices: 0013 % 0014 % Let Af refer to the square of the apparent power at the "from" end of 0015 % each branch, 0016 % 0017 % Af = abs(Sf).^2 0018 % = Sf .* conj(Sf) 0019 % = Pf.^2 + Qf.^2 0020 % 0021 % then ... 0022 % 0023 % Partial w.r.t real power, 0024 % dAf/dPf = 2 * diag(Pf) 0025 % 0026 % Partial w.r.t reactive power, 0027 % dAf/dQf = 2 * diag(Qf) 0028 % 0029 % Partial w.r.t V1 & V2 (e.g. Va and Vm, or Vr and Vi) 0030 % dAf/dV1 = dAf/dPf * dPf/dV1 + dAf/dQf * dQf/dV1 0031 % dAf/dV2 = dAf/dPf * dPf/dV2 + dAf/dQf * dQf/dV2 0032 % 0033 % Derivations for "to" bus are similar. 0034 % 0035 % Examples: 0036 % %% squared current magnitude 0037 % [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... 0038 % dIbr_dV(branch(il,:), Yf, Yt, V); 0039 % [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... 0040 % dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); 0041 % 0042 % %% squared apparent power flow 0043 % [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... 0044 % dSbr_dV(branch(il,:), Yf, Yt, V); 0045 % [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... 0046 % dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); 0047 % 0048 % %% squared real power flow 0049 % [dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft] = ... 0050 % dSbr_dV(branch(il,:), Yf, Yt, V); 0051 % dFf_dV1 = real(dFf_dV1); 0052 % dFf_dV2 = real(dFf_dV2); 0053 % dFt_dV1 = real(dFt_dV1); 0054 % dFt_dV2 = real(dFt_dV2); 0055 % [dAf_dV1, dAf_dV2, dAt_dV1, dAt_dV2] = ... 0056 % dAbr_dV(dFf_dV1, dFf_dV2, dFt_dV1, dFt_dV2, Ff, Ft); 0057 % 0058 % See also DIBR_DV, DSBR_DV. 0059 % 0060 % For more details on the derivations behind the derivative code used 0061 % in MATPOWER information, see: 0062 % 0063 % [TN2] R. D. Zimmerman, "AC Power Flows, Generalized OPF Costs and 0064 % their Derivatives using Complex Matrix Notation", MATPOWER 0065 % Technical Note 2, February 2010. [Online]. Available: 0066 % https://matpower.org/docs/TN2-OPF-Derivatives.pdf 0067 % doi: 10.5281/zenodo.3237866 0068 0069 % MATPOWER 0070 % Copyright (c) 1996-2019, Power Systems Engineering Research Center (PSERC) 0071 % by Ray Zimmerman, PSERC Cornell 0072 % 0073 % This file is part of MATPOWER. 0074 % Covered by the 3-clause BSD License (see LICENSE file for details). 0075 % See https://matpower.org for more info. 0076 0077 %% dimensions 0078 nl = length(Ff); 0079 0080 %%----- partials w.r.t. real and imaginary flows ----- 0081 dAf_dFfr = sparse(1:nl, 1:nl, 2 * real(Ff), nl, nl); 0082 dAf_dFfi = sparse(1:nl, 1:nl, 2 * imag(Ff), nl, nl); 0083 dAt_dFtr = sparse(1:nl, 1:nl, 2 * real(Ft), nl, nl); 0084 dAt_dFti = sparse(1:nl, 1:nl, 2 * imag(Ft), nl, nl); 0085 0086 %% partials w.r.t. voltage components (angle, magnitude or real, imaginary) 0087 dAf_dV1 = dAf_dFfr * real(dFf_dV1) + dAf_dFfi * imag(dFf_dV1); 0088 dAf_dV2 = dAf_dFfr * real(dFf_dV2) + dAf_dFfi * imag(dFf_dV2); 0089 dAt_dV1 = dAt_dFtr * real(dFt_dV1) + dAt_dFti * imag(dFt_dV1); 0090 dAt_dV2 = dAt_dFtr * real(dFt_dV2) + dAt_dFti * imag(dFt_dV2);