dSbus_dV

dSbus_dV(Ybus, V, vcart)

dSbus_dV() - Computes partial derivatives of power injection w.r.t. voltage.

The derivatives can be taken with respect to polar or cartesian coordinates
of voltage, depending on the 3rd argument.

[DSBUS_DVA, DSBUS_DVM] = DSBUS_DV(YBUS, V)
[DSBUS_DVA, DSBUS_DVM] = DSBUS_DV(YBUS, V, 0)

Returns two matrices containing partial derivatives of the complex bus
power injections w.r.t voltage angle and voltage magnitude, respectively
(for all buses).

[DSBUS_DVR, DSBUS_DVI] = DSBUS_DV(YBUS, V, 1)

Returns two matrices containing partial derivatives of the complex bus
power injections w.r.t the real and imaginary parts of voltage,
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

Polar coordinates:
  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))

Cartesian coordinates:
  Partials of V & Ibus w.r.t. real part of complex voltage
    dV/dVr = diag(ones(n,1))
    dI/dVr = Ybus * dV/dVr = Ybus

  Partials of V & Ibus w.r.t. imaginary part of complex voltage
    dV/dVi = j * diag(ones(n,1))
    dI/dVi = Ybus * dV/dVi = Ybus * j

  Partials of S w.r.t. real part of complex voltage
    dS/dVr = diag(V) * conj(dI/dVr) + diag(conj(Ibus)) * dV/dVr
           = diag(V) * conj(Ybus) + conj(diag(Ibus))

  Partials of S w.r.t. imaginary part of complex voltage
    dS/dVi = diag(V) * conj(dI/dVi) + diag(conj(Ibus)) * dV/dVi
           = j * (conj(diag(Ibus)) - diag(V) conj(Ybus))

Examples:
    [Ybus, Yf, Yt] = makeYbus(baseMVA, bus, branch);
    [dSbus_dVa, dSbus_dVm] = dSbus_dV(Ybus, V);
    [dSbus_dVr, dSbus_dVi] = dSbus_dV(Ybus, V, 1);

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
[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