Harmony
HARMONic stabilitY assessment of PE-penetrated power systems
Loading...
Searching...
No Matches
Differential_equations.h File Reference

Numerical integration, equilibrium finding, and discretization utilities. More...

#include "../../Constants.h"
Include dependency graph for Differential_equations.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  CVODEConfig
 Tolerance and step-size settings for CVODE integration. More...
 
struct  CVODEResult
 Time histories returned by CVODE integration. More...
 
struct  KINSOLConfig
 Convergence and scaling settings for KINSOL. More...
 

Typedefs

using RHSFunc = std::function< Eigen::VectorXd(double t, const Eigen::VectorXd &x, const Eigen::VectorXd &u)>
 Right-hand side of dx/dt = f(t, x, u).
 
using JacFunc = std::function< Eigen::MatrixXd(double t, const Eigen::VectorXd &x, const Eigen::VectorXd &u)>
 Jacobian J = ∂f/∂x(t, x, u).
 

Enumerations

enum class  KINSOLStrategy { Newton , LineSearch , Picard , FixedPoint }
 Nonlinear solver strategy for KINSOL equilibrium finding. More...
 

Functions

CVODEResult integrate (const RHSFunc &rhs, const Eigen::VectorXd &x0, const std::function< Eigen::VectorXd(double t)> &inputFn, double t0, double tEnd, double dt_output, const CVODEConfig &cfg={}, const JacFunc &jac=nullptr)
 Integrates an ODE system using CVODE (BDF, stiff).
 
Eigen::VectorXd findEquilibrium (const RHSFunc &rhs, const Eigen::VectorXd &x0, const Eigen::VectorXd &u, const KINSOLConfig &cfg={}, const JacFunc &jac=nullptr)
 Finds a steady-state equilibrium dx/dt = 0 for fixed input u.
 
Eigen::VectorXd findEquilibriumRobust (const RHSFunc &rhs, const Eigen::VectorXd &x0, const Eigen::VectorXd &u, const JacFunc &jac=nullptr)
 Robust equilibrium finder with a cascade of solver strategies.
 
std::pair< Eigen::MatrixXd, Eigen::MatrixXd > computeJacobians (const RHSFunc &rhs, const Eigen::VectorXd &x, const Eigen::VectorXd &u, double t=0.0, double eps=1e-8)
 Computes ∂f/∂x and ∂f/∂u by central finite differences.
 
void padeDelaySystem3 (double tdelay, Eigen::MatrixXd &A, Eigen::MatrixXd &B, Eigen::MatrixXd &C, Eigen::MatrixXd &D)
 First-order Padé delay approximation (single signal, order 3).
 
void padeDelaySystemMulti3 (double tdelay, Eigen::MatrixXd &A, Eigen::MatrixXd &B, Eigen::MatrixXd &C, Eigen::MatrixXd &D, int num_signals)
 First-order Padé delay approximation for multiple independent signals.
 
void padeDelaySystem2 (double tdelay, Eigen::MatrixXd &A, Eigen::MatrixXd &B, Eigen::MatrixXd &C, Eigen::MatrixXd &D)
 Second-order Padé delay approximation (single signal, order 2).
 
void padeDelaySystemMulti2 (double tdelay, Eigen::MatrixXd &A, Eigen::MatrixXd &B, Eigen::MatrixXd &C, Eigen::MatrixXd &D, int num_signals)
 Second-order Padé delay approximation for multiple independent signals.
 
void discretizeABCD (const Eigen::MatrixXd &A, const Eigen::MatrixXd &B, const Eigen::MatrixXd &C, const Eigen::MatrixXd &D, double Ts, Eigen::MatrixXd &Ad, Eigen::MatrixXd &Bd, Eigen::MatrixXd &Cd, Eigen::MatrixXd &Dd)
 Discretizes a continuous-time state-space model using the Tustin (bilinear) method.
 

Detailed Description

Numerical integration, equilibrium finding, and discretization utilities.

Wraps CVODE (stiff ODE integration), KINSOL (nonlinear equilibrium solvers), finite-difference Jacobian computation, Padé delay approximations, and Tustin (bilinear) discretization of state-space models.

Typedef Documentation

◆ JacFunc

using JacFunc = std::function<Eigen::MatrixXd(double t, const Eigen::VectorXd& x, const Eigen::VectorXd& u)>

Jacobian J = ∂f/∂x(t, x, u).

◆ RHSFunc

using RHSFunc = std::function<Eigen::VectorXd(double t, const Eigen::VectorXd& x, const Eigen::VectorXd& u)>

Right-hand side of dx/dt = f(t, x, u).

Enumeration Type Documentation

◆ KINSOLStrategy

enum class KINSOLStrategy
strong

Nonlinear solver strategy for KINSOL equilibrium finding.

Enumerator
Newton 
LineSearch 
Picard 
FixedPoint 

Function Documentation

◆ computeJacobians()

std::pair< Eigen::MatrixXd, Eigen::MatrixXd > computeJacobians ( const RHSFunc rhs,
const Eigen::VectorXd &  x,
const Eigen::VectorXd &  u,
double  t = 0.0,
double  eps = 1e-8 
)

Computes ∂f/∂x and ∂f/∂u by central finite differences.

Parameters
rhsODE right-hand side.
xState at which to evaluate.
uInput at which to evaluate.
tEvaluation time (default 0).
epsFinite-difference step size (default 1e-8).
Returns
Pair (df/dx, df/du).

References j.

Referenced by MMC::computeABCD(), MMC::computeABCD_analytical(), and kinsol_fd_jac_cb().

◆ discretizeABCD()

void discretizeABCD ( const Eigen::MatrixXd &  A,
const Eigen::MatrixXd &  B,
const Eigen::MatrixXd &  C,
const Eigen::MatrixXd &  D,
double  Ts,
Eigen::MatrixXd &  Ad,
Eigen::MatrixXd &  Bd,
Eigen::MatrixXd &  Cd,
Eigen::MatrixXd &  Dd 
)

Discretizes a continuous-time state-space model using the Tustin (bilinear) method.

Parameters
AContinuous-time state matrix.
BContinuous-time input matrix.
CContinuous-time output matrix.
DContinuous-time feed-through matrix.
TsSample period (s).
AdOutput discrete-time state matrix.
BdOutput discrete-time input matrix.
CdOutput discrete-time output matrix.
DdOutput discrete-time feed-through matrix.

Referenced by Converter::discretize(), and DQsym::run().

◆ findEquilibrium()

Eigen::VectorXd findEquilibrium ( const RHSFunc rhs,
const Eigen::VectorXd &  x0,
const Eigen::VectorXd &  u,
const KINSOLConfig cfg = {},
const JacFunc jac = nullptr 
)

Finds a steady-state equilibrium dx/dt = 0 for fixed input u.

Parameters
rhsODE right-hand side.
x0Initial guess for the state vector.
uFixed input vector.
cfgSolver strategy and tolerance settings.
jacOptional analytical Jacobian.
Returns
Equilibrium state vector.

References kinsolSolve().

◆ findEquilibriumRobust()

Eigen::VectorXd findEquilibriumRobust ( const RHSFunc rhs,
const Eigen::VectorXd &  x0,
const Eigen::VectorXd &  u,
const JacFunc jac = nullptr 
)

Robust equilibrium finder with a cascade of solver strategies.

Attempts LineSearch, then Newton, relaxed warmup, and Picard + Newton until convergence or all strategies are exhausted.

Parameters
rhsODE right-hand side.
x0Initial guess for the state vector.
uFixed input vector.
jacOptional analytical Jacobian.
Returns
Equilibrium state vector.

References KINSOLConfig::damping, KINSOLConfig::ftol, kinsolSolve(), LineSearch, KINSOLConfig::max_iter, Newton, Picard, KINSOLConfig::stol, KINSOLConfig::strategy, and withAutoScaling().

Referenced by MMC::solveEquilibrium().

◆ integrate()

CVODEResult integrate ( const RHSFunc rhs,
const Eigen::VectorXd &  x0,
const std::function< Eigen::VectorXd(double t)> &  inputFn,
double  t0,
double  tEnd,
double  dt_output,
const CVODEConfig cfg = {},
const JacFunc jac = nullptr 
)

Integrates an ODE system using CVODE (BDF, stiff).

Parameters
rhsRight-hand side f(t, x, u).
x0Initial state vector.
inputFnTime-varying input u(t).
t0Start time.
tEndEnd time.
dt_outputOutput sampling interval.
cfgTolerance and Jacobian settings.
jacOptional analytical Jacobian (nullptr → finite differences).
Returns
Sampled time and state histories.

References CVODEConfig::atol, cvode_jac_cb(), cvode_rhs_cb(), CVODEConfig::dt_max, eigen2nv(), nv2eigen(), CVODEConfig::rtol, CVODEResult::states, CVODEResult::time, and CVODEConfig::use_analytical_jac.

◆ padeDelaySystem2()

void padeDelaySystem2 ( double  tdelay,
Eigen::MatrixXd &  A,
Eigen::MatrixXd &  B,
Eigen::MatrixXd &  C,
Eigen::MatrixXd &  D 
)

Second-order Padé delay approximation (single signal, order 2).

Parameters
tdelayTransport delay (s).
AOutput state matrix.
BOutput input matrix.
COutput output matrix.
DOutput feed-through matrix.

◆ padeDelaySystem3()

void padeDelaySystem3 ( double  tdelay,
Eigen::MatrixXd &  A,
Eigen::MatrixXd &  B,
Eigen::MatrixXd &  C,
Eigen::MatrixXd &  D 
)

First-order Padé delay approximation (single signal, order 3).

Parameters
tdelayTransport delay (s).
AOutput state matrix.
BOutput input matrix.
COutput output matrix.
DOutput feed-through matrix.

◆ padeDelaySystemMulti2()

void padeDelaySystemMulti2 ( double  tdelay,
Eigen::MatrixXd &  A,
Eigen::MatrixXd &  B,
Eigen::MatrixXd &  C,
Eigen::MatrixXd &  D,
int  num_signals 
)

Second-order Padé delay approximation for multiple independent signals.

Parameters
tdelayTransport delay (s).
AOutput state matrix.
BOutput input matrix.
COutput output matrix.
DOutput feed-through matrix.
num_signalsNumber of delayed input channels.

◆ padeDelaySystemMulti3()

void padeDelaySystemMulti3 ( double  tdelay,
Eigen::MatrixXd &  A,
Eigen::MatrixXd &  B,
Eigen::MatrixXd &  C,
Eigen::MatrixXd &  D,
int  num_signals 
)

First-order Padé delay approximation for multiple independent signals.

Parameters
tdelayTransport delay (s).
AOutput state matrix.
BOutput input matrix.
COutput output matrix.
DOutput feed-through matrix.
num_signalsNumber of delayed input channels.