Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
vulcan::tf Namespace Reference

Transfer function utilities for linear systems and nonlinear elements. More...

Classes

struct  FirstOrderCoeffs
 First-order discrete-time system coefficients. More...
struct  SecondOrderCoeffs
 Second-order discrete-time system coefficients. More...

Functions

template<int N>
Eigen::Matrix< double, N, N > matrix_exp_pade (const Eigen::Matrix< double, N, N > &A)
 Compute matrix exponential using Padé(13,13) approximation.
template<int N>
void discretize_zoh (const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
 Zero-order hold (ZOH) discretization.
template<int N>
void discretize_tustin (const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
 Tustin (bilinear) discretization.
template<int N>
void discretize_euler (const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
 Forward Euler discretization.
template<int N>
void discretize_backward_euler (const Eigen::Matrix< double, N, N > &A_c, const Eigen::Matrix< double, N, 1 > &B_c, double dt, Eigen::Matrix< double, N, N > &A_d, Eigen::Matrix< double, N, 1 > &B_d)
 Backward Euler discretization.
template<typename Scalar>
FirstOrderCoeffs< Scalar > first_order (double tau, double K, double dt)
 Compute first-order discrete-time system coefficients.
template<typename Scalar>
Scalar first_order_step (const FirstOrderCoeffs< Scalar > &coeffs, const Scalar &state, const Scalar &input)
 Compute next state for first-order system (stateless).
template<typename Scalar>
Scalar first_order_response (double tau, double K, const Scalar &t)
 Compute analytical step response at time t.
template<typename Scalar>
Scalar rate_limit (const Scalar &current, const Scalar &commanded, double rate_max, double dt)
 Apply rate limiting to a value change (stateless).
template<typename Scalar>
Scalar saturate (const Scalar &value, const Scalar &min, const Scalar &max)
 Apply saturation/clamping (stateless).
template<typename Scalar>
Scalar deadband (const Scalar &input, double deadband_width)
 Apply deadband (stateless).
template<typename Scalar>
Scalar hysteresis (const Scalar &input, const Scalar &last_output, double hysteresis_width)
 Apply hysteresis (stateless computation).
template<typename Scalar>
SecondOrderCoeffs< Scalar > second_order (double omega_n, double zeta, double K, double dt)
 Compute second-order discrete-time system coefficients.
template<typename Scalar>
Eigen::Matrix< Scalar, 2, 1 > second_order_step (const SecondOrderCoeffs< Scalar > &coeffs, const Eigen::Matrix< Scalar, 2, 1 > &state, const Scalar &input)
 Compute next state for second-order system (stateless).
template<typename Scalar>
Scalar second_order_output (const SecondOrderCoeffs< Scalar > &coeffs, const Eigen::Matrix< Scalar, 2, 1 > &state, const Scalar &input)
 Extract output from state (stateless).
std::tuple< double, double, double > second_order_characteristics (double omega_n, double zeta)
 Compute theoretical system characteristics.

Detailed Description

Transfer function utilities for linear systems and nonlinear elements.

Provides symbolic-compatible, stateless functions for:

  • First-order systems (time constant filters)
  • Second-order systems (natural frequency, damping)
  • Discretization methods (ZOH, Tustin, Euler)
  • Nonlinear elements (rate limiting, saturation, deadband, hysteresis)

All functions are pure and stateless. State management is the responsibility of the calling simulation framework (e.g., Icarus).

Function Documentation

◆ deadband()

template<typename Scalar>
Scalar vulcan::tf::deadband ( const Scalar & input,
double deadband_width )

Apply deadband (stateless).

Returns zero for inputs within deadband, otherwise input minus deadband.

Template Parameters
ScalarVariable type
Parameters
inputInput value
deadband_widthDeadband half-width (symmetric around zero)
Returns
Scalar Output with deadband applied

◆ discretize_backward_euler()

template<int N>
void vulcan::tf::discretize_backward_euler ( const Eigen::Matrix< double, N, N > & A_c,
const Eigen::Matrix< double, N, 1 > & B_c,
double dt,
Eigen::Matrix< double, N, N > & A_d,
Eigen::Matrix< double, N, 1 > & B_d )

Backward Euler discretization.

Template Parameters
NState dimension

◆ discretize_euler()

template<int N>
void vulcan::tf::discretize_euler ( const Eigen::Matrix< double, N, N > & A_c,
const Eigen::Matrix< double, N, 1 > & B_c,
double dt,
Eigen::Matrix< double, N, N > & A_d,
Eigen::Matrix< double, N, 1 > & B_d )

Forward Euler discretization.

Template Parameters
NState dimension

◆ discretize_tustin()

template<int N>
void vulcan::tf::discretize_tustin ( const Eigen::Matrix< double, N, N > & A_c,
const Eigen::Matrix< double, N, 1 > & B_c,
double dt,
Eigen::Matrix< double, N, N > & A_d,
Eigen::Matrix< double, N, 1 > & B_d )

Tustin (bilinear) discretization.

Template Parameters
NState dimension

◆ discretize_zoh()

template<int N>
void vulcan::tf::discretize_zoh ( const Eigen::Matrix< double, N, N > & A_c,
const Eigen::Matrix< double, N, 1 > & B_c,
double dt,
Eigen::Matrix< double, N, N > & A_d,
Eigen::Matrix< double, N, 1 > & B_d )

Zero-order hold (ZOH) discretization.

Template Parameters
NState dimension
Parameters
A_cContinuous state matrix
B_cContinuous input matrix
dtSample time [s]
A_dOutput discrete state matrix
B_dOutput discrete input matrix

◆ first_order()

template<typename Scalar>
FirstOrderCoeffs< Scalar > vulcan::tf::first_order ( double tau,
double K,
double dt )

Compute first-order discrete-time system coefficients.

Template Parameters
ScalarVariable type
Parameters
tauTime constant [s] (must be positive)
KDC gain (default: 1.0)
dtSample time [s] (must be positive)
Returns
FirstOrderCoeffs<Scalar> The discretized coefficients

◆ first_order_response()

template<typename Scalar>
Scalar vulcan::tf::first_order_response ( double tau,
double K,
const Scalar & t )

Compute analytical step response at time t.

y(t) = K * (1 - exp(-t/tau))

Template Parameters
ScalarVariable type
Parameters
tauTime constant [s]
KDC gain
tTime [s]
Returns
Scalar Output at time t for unit step input

◆ first_order_step()

template<typename Scalar>
Scalar vulcan::tf::first_order_step ( const FirstOrderCoeffs< Scalar > & coeffs,
const Scalar & state,
const Scalar & input )

Compute next state for first-order system (stateless).

Computes: y[k+1] = a*y[k] + b*u[k]

Template Parameters
ScalarVariable type
Parameters
coeffsThe first-order coefficients
stateCurrent state y[k]
inputCurrent input u[k]
Returns
Scalar Next state y[k+1]

◆ hysteresis()

template<typename Scalar>
Scalar vulcan::tf::hysteresis ( const Scalar & input,
const Scalar & last_output,
double hysteresis_width )

Apply hysteresis (stateless computation).

Given input and last output, computes new output with hysteresis.

Template Parameters
ScalarVariable type
Parameters
inputCurrent input command
last_outputPrevious output
hysteresis_widthHysteresis half-width
Returns
Scalar New output

◆ matrix_exp_pade()

template<int N>
Eigen::Matrix< double, N, N > vulcan::tf::matrix_exp_pade ( const Eigen::Matrix< double, N, N > & A)

Compute matrix exponential using Padé(13,13) approximation.

Template Parameters
NMatrix dimension
Parameters
AInput matrix
Returns
Eigen::Matrix<double, N, N> exp(A)

◆ rate_limit()

template<typename Scalar>
Scalar vulcan::tf::rate_limit ( const Scalar & current,
const Scalar & commanded,
double rate_max,
double dt )

Apply rate limiting to a value change (stateless).

Limits the delta from current to commanded value.

Template Parameters
ScalarVariable type
Parameters
currentCurrent value
commandedCommanded value
rate_maxMaximum rate magnitude [units/s]
dtTime step [s]
Returns
Scalar Rate-limited next value

◆ saturate()

template<typename Scalar>
Scalar vulcan::tf::saturate ( const Scalar & value,
const Scalar & min,
const Scalar & max )

Apply saturation/clamping (stateless).

Template Parameters
ScalarVariable type
Parameters
valueValue to saturate
minMinimum allowed value
maxMaximum allowed value
Returns
Scalar Saturated value

◆ second_order()

template<typename Scalar>
SecondOrderCoeffs< Scalar > vulcan::tf::second_order ( double omega_n,
double zeta,
double K,
double dt )

Compute second-order discrete-time system coefficients.

Uses ZOH discretization via closed-form solution.

Template Parameters
ScalarVariable type
Parameters
omega_nNatural frequency [rad/s] (must be positive)
zetaDamping ratio (0 < zeta for stability)
KDC gain
dtSample time [s] (must be positive)
Returns
SecondOrderCoeffs<Scalar> The discretized coefficients

◆ second_order_characteristics()

std::tuple< double, double, double > vulcan::tf::second_order_characteristics ( double omega_n,
double zeta )
inline

Compute theoretical system characteristics.

Parameters
omega_nNatural frequency [rad/s]
zetaDamping ratio
Returns
std::tuple<double, double, double> {rise_time, settling_time, overshoot_percent}

◆ second_order_output()

template<typename Scalar>
Scalar vulcan::tf::second_order_output ( const SecondOrderCoeffs< Scalar > & coeffs,
const Eigen::Matrix< Scalar, 2, 1 > & state,
const Scalar & input )

Extract output from state (stateless).

Computes: y = C*x + D*u

Template Parameters
ScalarVariable type
Parameters
coeffsThe second-order coefficients
stateCurrent state [y, ẏ]ᵀ
inputCurrent input u[k]
Returns
Scalar Output y

◆ second_order_step()

template<typename Scalar>
Eigen::Matrix< Scalar, 2, 1 > vulcan::tf::second_order_step ( const SecondOrderCoeffs< Scalar > & coeffs,
const Eigen::Matrix< Scalar, 2, 1 > & state,
const Scalar & input )

Compute next state for second-order system (stateless).

Computes: x[k+1] = A*x[k] + B*u[k]

Template Parameters
ScalarVariable type
Parameters
coeffsThe second-order coefficients
stateCurrent state [y, ẏ]ᵀ
inputCurrent input u[k]
Returns
Eigen::Matrix<Scalar, 2, 1> Next state