40 const Eigen::MatrixXd& G,
41 const Eigen::MatrixXd& B,
42 const Eigen::VectorXd& Ps,
43 const Eigen::VectorXd& Qs,
45 Eigen::VectorXd& delta,
48 const std::vector<int>& pq_bus_id,
51 std::vector<std::pair<int, double>>* iterHistory
54 Eigen::VectorXd P(n_bus), Q(n_bus);
55 Eigen::VectorXd mismatch =
powerMismatch(Ps, Qs, G, B, V, delta, n_bus, pq_bus_id, P, Q);
57 double error = mismatch.cwiseAbs().maxCoeff();
62 iterHistory->emplace_back(0, error);
65 while (error >= tolerance) {
66 if (iter >= maxIter) {
68 LOG_WARN(
"Newton-Raphson did not converge within {} iterations.", maxIter);
69 LOG_DEBUG(
"Final max mismatch was {:.6e}, tolerance is {:.6e}.", error, tolerance);
75 Eigen::MatrixXd J =
computeJacobian(V, delta, n_bus, n_pq, pq_bus_id, G, B, P, Q);
78 Eigen::VectorXd correction = J.colPivHouseholderQr().solve(mismatch);
81 for (
int i = 1; i < n_bus; ++i) {
82 delta(i) += correction(i - 1);
86 for (
int k = 0; k < n_pq; ++k) {
87 V(pq_bus_id[k]) += correction(n_bus - 1 + k);
91 mismatch =
powerMismatch(Ps, Qs, G, B, V, delta, n_bus, pq_bus_id, P, Q);
93 error = mismatch.cwiseAbs().maxCoeff();
94 if (iterHistory) iterHistory->emplace_back(iter, error);
96 LOG_DEBUG(
"NR iteration {}: max mismatch = {:.16e}", iter, error);
100 LOG_DEBUG(
"Newton-Raphson converged in {} iterations with max mismatch {:.6e}", iter, error);
Eigen::MatrixXd computeJacobian(const Eigen::VectorXd &V, const Eigen::VectorXd &delta, int n_bus, int n_pq, const std::vector< int > &pq_bus_id, const Eigen::MatrixXd &G, const Eigen::MatrixXd &B, const Eigen::VectorXd &P, const Eigen::VectorXd &Q)
Computes the Jacobian matrix for the Newton-Raphson power flow solver.
Eigen::VectorXd powerMismatch(const Eigen::VectorXd &Ps, const Eigen::VectorXd &Qs, const Eigen::MatrixXd &G, const Eigen::MatrixXd &B, const Eigen::VectorXd &V, const Eigen::VectorXd &delta, int n_bus, const std::vector< int > &pq_bus_id, Eigen::VectorXd &P, Eigen::VectorXd &Q)
Computes the power mismatch vector for use in Newton-Raphson iterations.
void printIterationProgress(const std::string &solver, int iter, int maxIter, double error, double tol, int barWidth=50)
Print an iteration progress line for a solver.
void printConvergenceStatus(const std::string &solver, bool converged, int iter, int maxIter, double error, double tol, int barWidth=50)
Print the final convergence status line.