Eigensystem Realization Algorithm Module

Eigensystem Realization Algorithm (ERA) for Time Domain Modal Estimation

Implements the ERA from equations 27-35 for extracting modal parameters from impulse response data with multiple references and responses.

References

Fahey, S. O’F., & Pratt, J. (1998). Time domain modal estimation techniques. Experimental Techniques, 22(6), 45-49.

Juang, J. N., & Pappa, R. S. (1985). An eigensystem realization algorithm for modal parameter identification and model reduction. Journal of guidance, control, and dynamics, 8(5), 620-627.

time_domain_modal_estimation.era.build_hankel_matrix(Y, r, s, block_rows=None)[source]

Build generalized Hankel matrix from impulse response data (Equation 29).

Parameters:
  • Y (np.ndarray) – Impulse response matrix of shape (p, N) where p is number of outputs and N is number of time steps

  • r (int) – Number of block rows

  • s (int) – Number of block columns

  • block_rows (int, optional) – Explicit number of block rows (if different from r)

Returns:

H – Hankel matrix of shape (p*r, s)

Return type:

np.ndarray

Notes

From eq (29), the Hankel matrix H_r(k-1) is: H(k-1) = [Y(k) Y(k+1) … Y(k+s-1) ]

[Y(k+1) Y(k+2) … Y(k+s) ] [ … … … … ] [Y(k+r-1) Y(k+r) … Y(k+s+r-2) ]

Each block Y(i) can be a matrix itself for multiple outputs.

time_domain_modal_estimation.era.eigensystem_realization_algorithm(Y, dt, n_modes, r=None, s=None)[source]

Complete Eigensystem Realization Algorithm (ERA) implementation.

Parameters:
  • Y (np.ndarray) – Impulse response data of shape (p, N) where p is number of outputs and N is number of time steps

  • dt (float) – Time step (sampling interval)

  • n_modes (int) – Number of modes to extract (model order)

  • r (int, optional) – Number of block rows in Hankel matrix (default: N//2)

  • s (int, optional) – Number of block columns in Hankel matrix (default: N//2)

Returns:

results – Dictionary containing: - ‘frequencies’: Natural frequencies (Hz) - ‘damping_ratios’: Damping ratios (fraction of critical) - ‘mode_shapes’: Mode shapes (complex) - ‘A’: State matrix - ‘B’: Input matrix - ‘C’: Output matrix - ‘eigenvalues’: System eigenvalues - ‘eigenvectors’: System eigenvectors - ‘singular_values’: Singular values from SVD

Return type:

dict

Notes

Implements the ERA algorithm from equations 27-35: 1. Build Hankel matrices H(0) and H(1) (eq 29-30) 2. SVD of H(0) (eq 31) 3. Construct reduced-order system matrices (eq 32-33) 4. Extract eigenvalues and eigenvectors (eq 34) 5. Compute mode shapes, poles, and amplitudes (eq 35)

References

Fahey, S. O’F., & Pratt, J. (1998). Time domain modal estimation techniques. Experimental Techniques, 22(6), 45-49.

Juang, J. N., & Pappa, R. S. (1985). An eigensystem realization algorithm. Journal of guidance, control, and dynamics, 8(5), 620-627.

time_domain_modal_estimation.era.generate_impulse_response(frequencies, damping_ratios, mode_shapes, t, n_outputs=1)[source]

Generate synthetic impulse response data for testing ERA.

Parameters:
  • frequencies (list) – Natural frequencies in Hz

  • damping_ratios (list) – Damping ratios (fraction of critical)

  • mode_shapes (list) – Mode shape amplitudes for each output

  • t (np.ndarray) – Time vector

  • n_outputs (int) – Number of output channels

Returns:

Y – Impulse response matrix of shape (n_outputs, len(t))

Return type:

np.ndarray

time_domain_modal_estimation.era.stabilization_diagram(Y, dt, max_order, r=None, s=None, freq_tol=0.01, damp_tol=0.05)[source]

Generate stabilization diagram by running ERA at multiple model orders.

Parameters:
  • Y (np.ndarray) – Impulse response data

  • dt (float) – Time step

  • max_order (int) – Maximum model order to test

  • r (int, optional) – Hankel matrix block rows

  • s (int, optional) – Hankel matrix block columns

  • freq_tol (float) – Frequency tolerance for stability (default: 1%)

  • damp_tol (float) – Damping tolerance for stability (default: 5%)

Returns:

diagram – Contains ‘orders’, ‘frequencies’, ‘damping_ratios’, ‘stability’

Return type:

dict

Main Function

time_domain_modal_estimation.era.eigensystem_realization_algorithm(Y, dt, n_modes, r=None, s=None)[source]

Complete Eigensystem Realization Algorithm (ERA) implementation.

Parameters:
  • Y (np.ndarray) – Impulse response data of shape (p, N) where p is number of outputs and N is number of time steps

  • dt (float) – Time step (sampling interval)

  • n_modes (int) – Number of modes to extract (model order)

  • r (int, optional) – Number of block rows in Hankel matrix (default: N//2)

  • s (int, optional) – Number of block columns in Hankel matrix (default: N//2)

Returns:

results – Dictionary containing: - ‘frequencies’: Natural frequencies (Hz) - ‘damping_ratios’: Damping ratios (fraction of critical) - ‘mode_shapes’: Mode shapes (complex) - ‘A’: State matrix - ‘B’: Input matrix - ‘C’: Output matrix - ‘eigenvalues’: System eigenvalues - ‘eigenvectors’: System eigenvectors - ‘singular_values’: Singular values from SVD

Return type:

dict

Notes

Implements the ERA algorithm from equations 27-35: 1. Build Hankel matrices H(0) and H(1) (eq 29-30) 2. SVD of H(0) (eq 31) 3. Construct reduced-order system matrices (eq 32-33) 4. Extract eigenvalues and eigenvectors (eq 34) 5. Compute mode shapes, poles, and amplitudes (eq 35)

References

Fahey, S. O’F., & Pratt, J. (1998). Time domain modal estimation techniques. Experimental Techniques, 22(6), 45-49.

Juang, J. N., & Pappa, R. S. (1985). An eigensystem realization algorithm. Journal of guidance, control, and dynamics, 8(5), 620-627.

Helper Functions

Matrix Construction

time_domain_modal_estimation.era.build_hankel_matrix(Y, r, s, block_rows=None)[source]

Build generalized Hankel matrix from impulse response data (Equation 29).

Parameters:
  • Y (np.ndarray) – Impulse response matrix of shape (p, N) where p is number of outputs and N is number of time steps

  • r (int) – Number of block rows

  • s (int) – Number of block columns

  • block_rows (int, optional) – Explicit number of block rows (if different from r)

Returns:

H – Hankel matrix of shape (p*r, s)

Return type:

np.ndarray

Notes

From eq (29), the Hankel matrix H_r(k-1) is: H(k-1) = [Y(k) Y(k+1) … Y(k+s-1) ]

[Y(k+1) Y(k+2) … Y(k+s) ] [ … … … … ] [Y(k+r-1) Y(k+r) … Y(k+s+r-2) ]

Each block Y(i) can be a matrix itself for multiple outputs.

Synthetic Data Generation

time_domain_modal_estimation.era.generate_impulse_response(frequencies, damping_ratios, mode_shapes, t, n_outputs=1)[source]

Generate synthetic impulse response data for testing ERA.

Parameters:
  • frequencies (list) – Natural frequencies in Hz

  • damping_ratios (list) – Damping ratios (fraction of critical)

  • mode_shapes (list) – Mode shape amplitudes for each output

  • t (np.ndarray) – Time vector

  • n_outputs (int) – Number of output channels

Returns:

Y – Impulse response matrix of shape (n_outputs, len(t))

Return type:

np.ndarray

Model Order Selection

time_domain_modal_estimation.era.stabilization_diagram(Y, dt, max_order, r=None, s=None, freq_tol=0.01, damp_tol=0.05)[source]

Generate stabilization diagram by running ERA at multiple model orders.

Parameters:
  • Y (np.ndarray) – Impulse response data

  • dt (float) – Time step

  • max_order (int) – Maximum model order to test

  • r (int, optional) – Hankel matrix block rows

  • s (int, optional) – Hankel matrix block columns

  • freq_tol (float) – Frequency tolerance for stability (default: 1%)

  • damp_tol (float) – Damping tolerance for stability (default: 5%)

Returns:

diagram – Contains ‘orders’, ‘frequencies’, ‘damping_ratios’, ‘stability’

Return type:

dict