


D2IMIS_DV2 Computes 2nd derivatives of current balance w.r.t. voltage.
The derivatives can be take with respect to polar or cartesian coordinates
of voltage, depending on the 5th argument.
[GAA, GAV, GVA, GVV] = D2IMIS_DV2(SBUS, YBUS, V, LAM)
[GAA, GAV, GVA, GVV] = D2IMIS_DV2(SBUS, YBUS, V, LAM, 0)
Returns 4 matrices containing the partial derivatives w.r.t. voltage angle
and magnitude of the product of a vector LAM with the 1st partial
derivatives of the complex bus current balance.
[GRR, GIR, GIR, GII] = D2IMIS_DV2(SBUS, YBUS, V, LAM, 1)
Returns 4 matrices containing the partial derivatives w.r.t. real and
imaginary parts of voltage of the product of a vector LAM with the 1st
partial derivatives of the complex bus current balance.
Takes bus complex power injection (gen-load) vector, sparse bus admittance
matrix YBUS, voltage vector V and nb x 1 vector of multipliers LAM. Output
matrices are sparse.
Examples:
Sbus = makeSbus(baseMVA, bus, gen);
[Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch);
[Gaa, Gav, Gva, Gvv] = d2Imis_dV2(Sbus, Ybus, V, lam);
Here the output matrices correspond to:
Gaa = d/dVa (dImis_dVa.' * lam)
Gav = d/dVm (dImis_dVa.' * lam)
Gva = d/dVa (dImis_dVm.' * lam)
Gvv = d/dVm (dImis_dVm.' * lam)
[Grr, Gri, Gir, Gii] = d2Imis_dV2(Sbus, Ybus, V, lam, 1);
Here the output matrices correspond to:
Grr = d/dVr (dImis_dVr.' * lam)
Gri = d/dVi (dImis_dVr.' * lam)
Gir = d/dVr (dImis_dVi.' * lam)
Gii = d/dVi (dImis_dVi.' * lam)
For more details on the derivations behind the derivative code used
in MATPOWER, 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
[TN3] B. Sereeter and R. D. Zimmerman, "Addendum to AC Power Flows and
their Derivatives using Complex Matrix Notation: Nodal Current
Balance," MATPOWER Technical Note 3, April 2018. [Online].
Available: https://matpower.org/docs/TN3-More-OPF-Derivatives.pdf
doi: 10.5281/zenodo.3237900
[TN4] B. Sereeter and R. D. Zimmerman, "AC Power Flows and their
Derivatives using Complex Matrix Notation and Cartesian
Coordinate Voltages," MATPOWER Technical Note 4, April 2018.
[Online]. Available: https://matpower.org/docs/TN4-OPF-Derivatives-Cartesian.pdf
doi: 10.5281/zenodo.3237909

0001 function [G11, G12, G21, G22] = d2Imis_dV2(Sbus, Ybus, V, lam, vcart) 0002 %D2IMIS_DV2 Computes 2nd derivatives of current balance w.r.t. voltage. 0003 % 0004 % The derivatives can be take with respect to polar or cartesian coordinates 0005 % of voltage, depending on the 5th argument. 0006 % 0007 % [GAA, GAV, GVA, GVV] = D2IMIS_DV2(SBUS, YBUS, V, LAM) 0008 % [GAA, GAV, GVA, GVV] = D2IMIS_DV2(SBUS, YBUS, V, LAM, 0) 0009 % 0010 % Returns 4 matrices containing the partial derivatives w.r.t. voltage angle 0011 % and magnitude of the product of a vector LAM with the 1st partial 0012 % derivatives of the complex bus current balance. 0013 % 0014 % [GRR, GIR, GIR, GII] = D2IMIS_DV2(SBUS, YBUS, V, LAM, 1) 0015 % 0016 % Returns 4 matrices containing the partial derivatives w.r.t. real and 0017 % imaginary parts of voltage of the product of a vector LAM with the 1st 0018 % partial derivatives of the complex bus current balance. 0019 % 0020 % Takes bus complex power injection (gen-load) vector, sparse bus admittance 0021 % matrix YBUS, voltage vector V and nb x 1 vector of multipliers LAM. Output 0022 % matrices are sparse. 0023 % 0024 % Examples: 0025 % Sbus = makeSbus(baseMVA, bus, gen); 0026 % [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch); 0027 % [Gaa, Gav, Gva, Gvv] = d2Imis_dV2(Sbus, Ybus, V, lam); 0028 % 0029 % Here the output matrices correspond to: 0030 % Gaa = d/dVa (dImis_dVa.' * lam) 0031 % Gav = d/dVm (dImis_dVa.' * lam) 0032 % Gva = d/dVa (dImis_dVm.' * lam) 0033 % Gvv = d/dVm (dImis_dVm.' * lam) 0034 % 0035 % [Grr, Gri, Gir, Gii] = d2Imis_dV2(Sbus, Ybus, V, lam, 1); 0036 % 0037 % Here the output matrices correspond to: 0038 % Grr = d/dVr (dImis_dVr.' * lam) 0039 % Gri = d/dVi (dImis_dVr.' * lam) 0040 % Gir = d/dVr (dImis_dVi.' * lam) 0041 % Gii = d/dVi (dImis_dVi.' * lam) 0042 % 0043 % For more details on the derivations behind the derivative code used 0044 % in MATPOWER, see: 0045 % 0046 % [TN2] R. D. Zimmerman, "AC Power Flows, Generalized OPF Costs and 0047 % their Derivatives using Complex Matrix Notation", MATPOWER 0048 % Technical Note 2, February 2010. [Online]. Available: 0049 % https://matpower.org/docs/TN2-OPF-Derivatives.pdf 0050 % doi: 10.5281/zenodo.3237866 0051 % [TN3] B. Sereeter and R. D. Zimmerman, "Addendum to AC Power Flows and 0052 % their Derivatives using Complex Matrix Notation: Nodal Current 0053 % Balance," MATPOWER Technical Note 3, April 2018. [Online]. 0054 % Available: https://matpower.org/docs/TN3-More-OPF-Derivatives.pdf 0055 % doi: 10.5281/zenodo.3237900 0056 % [TN4] B. Sereeter and R. D. Zimmerman, "AC Power Flows and their 0057 % Derivatives using Complex Matrix Notation and Cartesian 0058 % Coordinate Voltages," MATPOWER Technical Note 4, April 2018. 0059 % [Online]. Available: https://matpower.org/docs/TN4-OPF-Derivatives-Cartesian.pdf 0060 % doi: 10.5281/zenodo.3237909 0061 0062 % MATPOWER 0063 % Copyright (c) 2019, Power Systems Engineering Research Center (PSERC) 0064 % by Baljinnyam Sereeter, Delft University of Technology 0065 % and Ray Zimmerman, PSERC Cornell 0066 % 0067 % This file is part of MATPOWER. 0068 % Covered by the 3-clause BSD License (see LICENSE file for details). 0069 % See https://matpower.org for more info. 0070 0071 %% default input args 0072 if nargin < 5 0073 vcart = 0; %% default to polar coordinates 0074 end 0075 0076 nb = length(V); 0077 0078 if vcart 0079 C = 2 * lam .* conj(Sbus./(V.^3)); 0080 0081 G22 = sparse(1:nb, 1:nb, C, nb, nb); 0082 G11 = -G22; 0083 G12 = 1j*G22; 0084 G21 = G12; 0085 else 0086 absV = abs(V); 0087 diagV = sparse(1:nb, 1:nb, V, nb, nb); 0088 diagV1 = sparse(1:nb, 1:nb, 1./V, nb, nb); 0089 diagVmV1 = sparse(1:nb, 1:nb, 1./(V.*absV), nb, nb); 0090 diagVmV2 = sparse(1:nb, 1:nb, 1./(V.*(absV.^2)), nb, nb); 0091 diagLamS = sparse(1:nb, 1:nb, lam.*Sbus, nb, nb); 0092 diagYlam = sparse(1:nb, 1:nb, Ybus.'*lam, nb, nb); 0093 diagE = sparse(1:nb, 1:nb, V./absV, nb, nb); 0094 0095 G11 = - diagYlam* diagV + conj(diagLamS*diagV1); 0096 G22 = - 2 * conj(diagLamS*diagVmV2); 0097 G21 = 1j * ( diagYlam* diagE + conj(diagLamS*diagVmV1)) ; 0098 G12 = G21.'; 0099 end