예제 #1
0
  /**
   * 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:
   *
   * <p>S = diag(V) * conj(Ibus) = diag(conj(Ibus)) * V
   *
   * <p>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))
   *
   * <p>Partials of V & Ibus w.r.t. voltage angles dV/dVa = j * diag(V) dI/dVa = Ybus * dV/dVa =
   * Ybus * j * diag(V)
   *
   * <p>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))
   *
   * <p>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))
   *
   * @param Ybus
   * @param V
   * @return
   */
  @SuppressWarnings("static-access")
  public static DComplexMatrix2D[] jp_dSbus_dV(DComplexMatrix2D Ybus, DComplexMatrix1D V) {
    int n;
    int[] ib;
    DComplexMatrix1D Ibus, absV, Vnorm;
    DComplexMatrix2D[] dSbus_dV;
    SparseRCDComplexMatrix2D diagV, diagIbus, diagVnorm, rhs, dS_dVa, conjInorm, dS_dVm, addend;

    n = (int) V.size();
    ib = Djp_util.irange(n);
    Ibus = Ybus.zMult(V, null);

    diagV = new SparseRCDComplexMatrix2D(n, n, ib, ib, V.toArray(), false, false);
    diagIbus = new SparseRCDComplexMatrix2D(n, n, ib, ib, Ibus.toArray(), false, false);

    absV = V.copy().assign(cfunc.abs);
    Vnorm = V.copy().assign(absV, cfunc.div);
    diagVnorm = new SparseRCDComplexMatrix2D(n, n, ib, ib, Vnorm.toArray(), false, false);

    rhs = (SparseRCDComplexMatrix2D) Ybus.zMult(diagV, null);

    rhs.assign(diagIbus, cfunc.swapArgs(cfunc.minus)).assign(cfunc.conj);
    dS_dVa = (SparseRCDComplexMatrix2D) diagV.zMult(rhs, null);
    dS_dVa.assign(cfunc.mult(new double[] {0, 1}));

    conjInorm = (SparseRCDComplexMatrix2D) Ybus.zMult(diagVnorm, null);
    conjInorm.assign(cfunc.conj);
    dS_dVm = (SparseRCDComplexMatrix2D) diagV.zMult(conjInorm, null);

    diagIbus.assign(cfunc.conj);
    addend = (SparseRCDComplexMatrix2D) diagVnorm.zMult(diagIbus, null);
    dS_dVm.assign(addend, cfunc.plus);

    dSbus_dV = new DComplexMatrix2D[] {dS_dVm, dS_dVa};

    return dSbus_dV;
  }