GitHub

R API Reference

Complete reference for the koopman.dmd R package -- Rust-powered Koopman DMD with idiomatic S3 classes.

Installation

The koopman.dmd package is an R wrapper around the Rust koopman-dmd library, available on CRAN:

install.packages("koopman.dmd")

CRAN provides prebuilt binaries for Windows and macOS. Installing from source compiles the bundled Rust dependency tree locally, which requires a working Rust toolchain (cargo and rustc >= 1.85) in addition to the standard R development tools. To install from a checkout of the repository:

# Install from the local source directory
R CMD INSTALL koopman-dmd-r

Verify the installation by loading the package in an R session:

library(koopman.dmd)
cat("koopman.dmd loaded successfully\n")
Requirements. You need cargo and rustc installed and available on your PATH. The package build process compiles the Rust library automatically using Cargo. On Linux, ensure libR-dev (Debian/Ubuntu) or R-devel (Fedora/RHEL) is installed.

DMD Functions

dmd

Perform Dynamic Mode Decomposition on a numeric matrix. This is the primary entry point for standard and extended DMD analysis. Returns an S3 object of class "dmd".

Argument Type Default Description
data numeric matrix -- Data matrix with dimensions n_vars x n_time. Each row is a state variable; each column is a time snapshot.
rank integer or NULL NULL Truncation rank for the SVD. NULL selects rank automatically via singular-value threshold.
center logical FALSE If TRUE, subtract the temporal mean from each row before decomposition. The mean is stored and added back during reconstruction.
lifting character or NULL NULL Optional nonlinear lifting function. One of "polynomial", "trigonometric", or "delay".
lifting_param integer or NULL NULL Parameter for the lifting function: polynomial degree, number of harmonics, or number of delay embeddings.

Return value. An S3 object of class "dmd" with the following components:

Component Type Description
eigenvalues_re numeric vector Real parts of the DMD eigenvalues.
eigenvalues_im numeric vector Imaginary parts of the DMD eigenvalues.
rank integer Truncation rank used in the decomposition.
n_vars integer Number of state variables (rows of the input).
n_time integer Number of time snapshots (columns of the input).
.result_ptr externalptr Internal pointer to the Rust result object. Used by downstream functions; do not modify.
library(koopman.dmd)

# Generate sample data: 3 variables, 100 time steps
t <- seq(0, 2 * pi, length.out = 100)
data <- rbind(
  sin(t),
  cos(t),
  sin(2 * t)
)

# Standard DMD with auto-rank
result <- dmd(data)

# DMD with explicit rank and centering
result <- dmd(data, rank = 4, center = TRUE)

# Extended DMD with polynomial lifting
result <- dmd(data, lifting = "polynomial", lifting_param = 3L)

# Extended DMD with trigonometric lifting
result <- dmd(data, lifting = "trigonometric", lifting_param = 5L)

# Extended DMD with delay embedding
result <- dmd(data, lifting = "delay", lifting_param = 10L)

S3 print method for "dmd" objects. Displays a concise summary including the rank, number of variables, and number of time steps.

print(result)
# DMD Result
#   Rank:       4
#   Variables:  3
#   Time steps: 100

summary.dmd

S3 summary method for "dmd" objects. Prints a table of eigenvalues with their real parts, imaginary parts, moduli, and frequencies.

summary(result)
# DMD Eigenvalues:
#   Re(lambda)  Im(lambda)  |lambda|  Frequency
#   0.9998      0.0175      1.0000    0.0028
#   0.9998     -0.0175      1.0000   -0.0028
#   ...

predict.dmd

S3 predict method for "dmd" objects. Extrapolates the fitted DMD model forward in time.

Argument Type Default Description
object dmd -- A fitted DMD result.
n_ahead integer -- Number of future time steps to predict.
x0 numeric vector or NULL NULL Optional initial condition. If NULL, uses the first snapshot from the original data.

Return value. A numeric matrix of dimensions n_vars x n_ahead containing the predicted states.

# Predict 50 future time steps
forecast <- predict(result, n_ahead = 50)
cat("Forecast dimensions:", dim(forecast), "\n")

# Predict from a custom initial condition
x0 <- c(0.5, 0.5, 0.5)
forecast <- predict(result, n_ahead = 50, x0 = x0)

dmd_reconstruct

Reconstruct the original data from the DMD decomposition. Produces the fitted values by combining modes, eigenvalues, and amplitudes. If centering was used, the stored mean is added back automatically.

Argument Type Default Description
result dmd -- A fitted DMD result.
n_time integer -- Number of time steps to reconstruct.
x0 numeric vector or NULL NULL Optional initial condition. If NULL, uses the first snapshot from the original data.

Return value. A numeric matrix of dimensions n_vars x n_time containing the reconstructed data.

# Reconstruct the original 100 time steps
recon <- dmd_reconstruct(result, n_time = 100)
cat("Reconstruction dimensions:", dim(recon), "\n")

dmd_spectrum

Compute the spectral properties of the DMD decomposition. Returns a data frame summarizing the frequency content, growth rates, damping, and stability of each mode.

Argument Type Default Description
result dmd -- A fitted DMD result.
dt numeric 1.0 Time step between snapshots. Used to convert discrete eigenvalues to continuous-time frequencies.

Return value. A data.frame with the following columns:

Column Type Description
frequency numeric Angular frequency of each mode (radians per unit time).
magnitude numeric Modulus of the eigenvalue (distance from origin).
growth_rate numeric Continuous-time growth rate (log of modulus divided by dt).
damping_ratio numeric Damping ratio of each mode.
stability character One of "stable", "unstable", or "neutral".
# Compute spectrum with default time step
spec <- dmd_spectrum(result)
print(spec)

# Compute spectrum with explicit time step
spec <- dmd_spectrum(result, dt = 0.01)
print(spec)

dmd_stability

Assess the stability of the DMD model by examining the eigenvalue spectrum.

Argument Type Default Description
result dmd -- A fitted DMD result.
tol numeric 1e-6 Tolerance for classifying eigenvalues as neutral (on the unit circle).

Return value. A list with the following components:

Component Type Description
spectral_radius numeric Maximum modulus among all eigenvalues.
is_stable logical TRUE if all eigenvalues lie inside or on the unit circle (within tolerance).
is_unstable logical TRUE if any eigenvalue lies outside the unit circle.
n_growing integer Number of eigenvalues with modulus greater than 1 + tol.
n_decaying integer Number of eigenvalues with modulus less than 1 - tol.
n_neutral integer Number of eigenvalues with modulus within tol of 1.
stab <- dmd_stability(result)
cat("Spectral radius:", stab$spectral_radius, "\n")
cat("Stable:", stab$is_stable, "\n")
cat("Growing modes:", stab$n_growing, "\n")
cat("Decaying modes:", stab$n_decaying, "\n")
cat("Neutral modes:", stab$n_neutral, "\n")

dmd_error

Compute reconstruction error metrics for a DMD result against the original data.

Argument Type Default Description
result dmd -- A fitted DMD result.
data numeric matrix -- The original data matrix used for fitting.

Return value. A list with the following components:

Component Type Description
rmse numeric Root mean squared error across all entries.
relative_error numeric Frobenius norm of the residual divided by the Frobenius norm of the original data.
max_error numeric Maximum absolute error across all entries.
err <- dmd_error(result, data)
cat("RMSE:          ", err$rmse, "\n")
cat("Relative error:", err$relative_error, "\n")
cat("Max error:     ", err$max_error, "\n")

dmd_dominant_modes

Extract the dominant DMD modes ranked by a specified criterion.

Argument Type Default Description
result dmd -- A fitted DMD result.
criterion character "amplitude" Ranking criterion. One of "amplitude" (mode amplitude) or other supported criteria.
n integer 3 Number of top modes to return.

Return value. A data.frame with one row per dominant mode, including eigenvalue, frequency, amplitude, and growth rate columns.

# Get top 3 modes by amplitude
top <- dmd_dominant_modes(result, criterion = "amplitude", n = 3)
print(top)

dmd_residual

Compute residuals for each DMD mode, measuring how well each mode satisfies the linear operator relationship.

Argument Type Default Description
result dmd -- A fitted DMD result.

Return value. A list with the following components:

Component Type Description
mode_residuals numeric vector Residual norm for each individual mode.
max_residual numeric Maximum residual across all modes.
mean_residual numeric Mean residual across all modes.
resid <- dmd_residual(result)
cat("Max residual: ", resid$max_residual, "\n")
cat("Mean residual:", resid$mean_residual, "\n")
print(resid$mode_residuals)

DMDc Functions

dmdc

Perform Dynamic Mode Decomposition with control (DMDc; Proctor, Brunton & Kutz 2016, doi:10.1137/15M1013857). Identifies the forced linear system xt+1 = A xt + B ut from snapshot pairs. Unlike dmd(), which takes one contiguous trajectory, dmdc() takes explicit pair matrices: X1 holds states at time t, X2 the states one step later, and U the control input applied during each transition. Columns may come from many concatenated trajectories. Returns an S3 object of class "dmdc".

Argument Type Default Description
X1 numeric matrix -- State snapshots at time t, with dimensions n_states x n_pairs.
X2 numeric matrix -- State snapshots one step later (n_states x n_pairs). Column j is the successor of column j of X1.
U numeric matrix or NULL NULL Control input applied during each transition (n_inputs x n_pairs). A plain vector is taken as a single input row. NULL fits an autonomous multi-trajectory model from the pairs (b gets zero columns).
rank_input integer or NULL NULL Truncation rank for the regression-input SVD ([X1; U], or X1 alone when known_B is given). NULL selects 99% cumulative variance. A rank beyond the numerical rank of the data is an error.
rank_output integer or NULL NULL Optional second projection through the leading left singular vectors of X2, producing reduced operators a_tilde (r x r) and b_tilde (r x q). NULL keeps everything full-order (the basis is the identity and a_tilde equals a).
dt numeric 1.0 Time step between snapshots. Must be positive and finite.
known_B numeric matrix or NULL NULL Known input matrix B (n_states x n_inputs). When given, B is not estimated and only A is solved for on the input-subtracted residual. Preferred when the input coupling is known by construction; required for closed-loop (state-feedback) data, where joint identification is biased and non-unique.

Return value. An S3 object of class "dmdc" with the following components:

Component Type Description
a numeric matrix Identified state matrix A (n_states x n_states).
b numeric matrix Identified input matrix B (n_states x n_inputs); a copy of known_B when supplied.
a_tilde numeric matrix Reduced state operator (rank_output x rank_output); equals a when no output projection is used.
b_tilde numeric matrix Reduced input operator (rank_output x n_inputs).
basis numeric matrix Orthonormal output basis (n_states x rank_output); the identity when no projection is used.
eigenvalues_re numeric vector Real parts of the eigenvalues of a_tilde -- the spectrum of the unforced dynamics.
eigenvalues_im numeric vector Imaginary parts of the eigenvalues of a_tilde.
singular_values numeric vector Singular values of the regression-input SVD.
rank_input integer Truncation rank used for the regression-input SVD.
rank_output integer Dimension of the output projection.
dt numeric Time step between snapshots.
n_states integer Number of state variables.
n_inputs integer Number of control inputs.
library(koopman.dmd)

# Simulate a forced linear system x_{t+1} = A0 x_t + B0 u_t
A0 <- matrix(c(0.9, 0, 0.1, 0.8), 2, 2)
B0 <- matrix(c(0.5, 1), 2, 1)
m <- 120
X1 <- matrix(0, 2, m); X2 <- matrix(0, 2, m); U <- matrix(0, 1, m)
x <- c(1, -0.5)
for (t in seq_len(m)) {
  u_t <- sin(0.7 * (t - 1)) + 0.5 * cos(2.3 * (t - 1) + 1)
  X1[, t] <- x
  U[, t] <- u_t
  x <- as.numeric(A0 %*% x + B0 * u_t)
  X2[, t] <- x
}

# Identify A and B from the snapshot pairs
fit <- dmdc(X1, X2, U, rank_input = 3)
round(fit$a, 6)   # recovers A0
round(fit$b, 6)   # recovers B0

# Known input matrix: estimate A only
fit_kb <- dmdc(X1, X2, U, rank_input = 2, known_B = B0)

# Autonomous multi-trajectory model from the same pairs
fit_auto <- dmdc(X1, X2)

S3 print method for "dmdc" objects. Displays a concise one-line summary of the system dimensions and ranks.

print(fit)
# DMDc(n_states=2, n_inputs=1, rank_input=3, rank_output=2)

summary.dmdc

S3 summary method for "dmdc" objects. Prints the numbers of states and inputs, the truncation ranks, the time step, the singular values of the regression-input SVD, and the eigenvalue magnitudes.

summary(fit)
# DMDc(n_states=2, n_inputs=1, rank_input=3, rank_output=2)
#   dt:                    1
#   Singular values:       ...
#   Eigenvalue magnitudes: 0.9  0.8

predict.dmdc

S3 predict method for "dmdc" objects. Simulates the identified system xt+1 = A xt + B ut forward under a supplied input sequence.

Argument Type Default Description
object dmdc -- A fitted DMDc result.
U numeric matrix or NULL NULL Input sequence (n_inputs x n_steps); its number of columns sets the prediction horizon. A plain vector is taken as a single input row. NULL applies zero input for n_ahead steps (n_ahead is then required).
x0 numeric vector or NULL NULL Initial condition. If NULL, uses the first stored snapshot (the first column of X1).
n_ahead integer or NULL NULL Number of steps to simulate. Required when U is NULL; if both U and n_ahead are given they must match.

Return value. A numeric matrix of dimensions n_states x k containing the predicted states x1..xk -- the successors of x0; x0 itself is not included.

# Replay the training inputs -- reproduces X2
pred <- predict(fit, U = U)

# Unforced (zero-input) response from a custom initial state
free <- predict(fit, x0 = c(1, 0), n_ahead = 20)

dmdc_stability

Assess the stability of the identified operator from the eigenvalues of a_tilde -- the spectrum of the unforced dynamics. The result has the same shape as dmd_stability().

Argument Type Default Description
object dmdc -- A fitted DMDc result.
tol numeric 1e-6 Tolerance for classifying the spectral radius as marginal (on the unit circle).

Return value. A list with the following components:

Component Type Description
is_stable logical TRUE if all eigenvalues lie inside the unit circle (within tolerance).
is_unstable logical TRUE if any eigenvalue lies outside the unit circle.
is_marginal logical TRUE if the spectral radius is within tol of 1.
spectral_radius numeric Maximum modulus among the eigenvalues of a_tilde.
stab <- dmdc_stability(fit)
cat("Spectral radius:", stab$spectral_radius, "\n")
cat("Stable:", stab$is_stable, "\n")

dmdc_spectrum

Compute per-mode frequency, growth rate, and stability for the identified operator, in the same shape as dmd_spectrum(). DMDc has no mode amplitudes, so the amplitude column is always 0.

Argument Type Default Description
object dmdc -- A fitted DMDc result.
dt numeric or NULL NULL Time step used to convert eigenvalues to continuous-time quantities. NULL uses the dt stored in the model.

Return value. A data.frame with the following columns:

Column Type Description
index integer Mode index.
magnitude numeric Modulus of the eigenvalue.
phase numeric Argument of the eigenvalue in radians.
frequency numeric Oscillation frequency of the mode per unit time.
period numeric Oscillation period of the mode.
growth_rate numeric Continuous-time growth rate (log of modulus divided by dt).
amplitude numeric Always 0 -- DMDc does not compute mode amplitudes.
stability character One of "stable", "unstable", or "neutral".
# Spectrum with the stored time step
spec <- dmdc_spectrum(fit)
print(spec)

# Override the time step
spec <- dmdc_spectrum(fit, dt = 0.1)

Hankel-DMD Functions

hankel_dmd

Perform Hankel-DMD, which augments the data with time-delay embeddings before applying DMD. This is particularly effective for scalar time series or systems where a single observable does not fully capture the underlying dynamics. Returns an S3 object of class "hankel_dmd".

Argument Type Default Description
data numeric matrix -- Data matrix with dimensions n_vars x n_time.
delays integer or NULL NULL Number of delay embeddings. NULL selects automatically.
rank integer or NULL NULL Truncation rank. NULL selects automatically.
dt numeric 1.0 Time step between snapshots.

Return value. An S3 object of class "hankel_dmd" with components similar to the standard "dmd" class, plus delay embedding metadata.

library(koopman.dmd)

# Scalar time series: 1 x 500 matrix
t <- seq(0, 10 * pi, length.out = 500)
data <- matrix(sin(t) + 0.5 * sin(3 * t), nrow = 1)

# Hankel-DMD with 20 delays
hresult <- hankel_dmd(data, delays = 20)
print(hresult)

S3 print method for "hankel_dmd" objects. Displays a concise summary including the rank, delay embedding depth, and data dimensions.

print(hresult)
# Hankel-DMD Result
#   Rank:    10
#   Delays:  20
#   Vars:    1
#   Steps:   500

predict.hankel_dmd

S3 predict method for "hankel_dmd" objects. Extrapolates the fitted Hankel-DMD model forward in time.

Argument Type Default Description
object hankel_dmd -- A fitted Hankel-DMD result.
n_ahead integer -- Number of future time steps to predict.

Return value. A numeric matrix containing the predicted states in the original (non-embedded) variable space.

# Predict 100 steps ahead
hforecast <- predict(hresult, n_ahead = 100)
cat("Forecast dimensions:", dim(hforecast), "\n")

hankel_reconstruct

Reconstruct the original data from the Hankel-DMD decomposition, projecting back from the delay-embedded space to the original variable space.

Argument Type Default Description
result hankel_dmd -- A fitted Hankel-DMD result.

Return value. A numeric matrix containing the reconstructed data.

hrecon <- hankel_reconstruct(hresult)
cat("Reconstruction dimensions:", dim(hrecon), "\n")

GLA Functions

gla

Perform Generalized Laplace Analysis (GLA) to extract Koopman eigenvalues and eigenfunctions from trajectory data. GLA is an iterative algorithm that converges to the dominant Koopman modes. Returns an S3 object of class "gla".

Argument Type Default Description
data numeric matrix -- Data matrix with dimensions n_vars x n_time.
n_eigenvalues integer 2 Number of Koopman eigenvalues to extract.
tol numeric 1e-6 Convergence tolerance for the iterative algorithm.
max_iter integer or NULL NULL Maximum number of iterations. NULL uses a library default.

Return value. An S3 object of class "gla" containing the extracted Koopman eigenvalues and associated data.

library(koopman.dmd)

# Generate trajectory data
t <- seq(0, 4 * pi, length.out = 200)
data <- rbind(sin(t), cos(t))

# Extract 4 Koopman eigenvalues
gresult <- gla(data, n_eigenvalues = 4, tol = 1e-8)
print(gresult)

S3 print method for "gla" objects. Displays a summary of the GLA result including the number of extracted eigenvalues and convergence information.

print(gresult)
# GLA Result
#   Eigenvalues: 4
#   Converged:   TRUE

predict.gla

S3 predict method for "gla" objects. Extrapolates the fitted GLA model forward in time using the extracted Koopman modes.

Argument Type Default Description
object gla -- A fitted GLA result.
n_ahead integer -- Number of future time steps to predict.

Return value. A numeric matrix containing the predicted states.

# Predict 50 steps ahead
gforecast <- predict(gresult, n_ahead = 50)
cat("Forecast dimensions:", dim(gforecast), "\n")

gla_reconstruct

Reconstruct the original data from the GLA decomposition.

Argument Type Default Description
result gla -- A fitted GLA result.

Return value. A numeric matrix containing the reconstructed data.

grecon <- gla_reconstruct(gresult)
cat("Reconstruction dimensions:", dim(grecon), "\n")

Map Functions

generate_trajectory

Iterate a dynamical map from a given initial condition and return a matrix of states. Each column of the returned matrix is a snapshot of the system state at a single time step.

Argument Type Default Description
ic numeric vector -- Initial condition vector. Length must match the dimensionality of the selected map.
map character -- Map name. One of "standard", "froeschle", "extended_standard", "henon", or "logistic".
n_steps integer -- Number of iterations to compute.
... various -- Map-specific parameters. See helper constructors below.

Return value. A numeric matrix of dimensions n_dim x n_steps where n_dim is the dimensionality of the map.

library(koopman.dmd)

# Standard map
traj <- generate_trajectory(
  ic = c(0.1, 0.2),
  map = "standard",
  n_steps = 1000,
  epsilon = 0.12
)
cat("Trajectory shape:", dim(traj), "\n")  # 2 x 1000

# Henon map
traj <- generate_trajectory(
  ic = c(0.0, 0.0),
  map = "henon",
  n_steps = 5000,
  a = 1.4,
  b = 0.3
)

# Logistic map
traj <- generate_trajectory(
  ic = 0.4,
  map = "logistic",
  n_steps = 500,
  r = 3.9
)

Helper Constructors

Convenience functions that return named lists of map parameters with sensible defaults. These can be expanded with do.call or used for documentation purposes.

Function Parameters Defaults
standard_map(epsilon) epsilon 0.12
froeschle_map(epsilon1, epsilon2, epsilon3) epsilon1, epsilon2, epsilon3 0.12, 0.12, 0.05
extended_standard_map(epsilon, alpha) epsilon, alpha --
henon_map(a, b) a, b 1.4, 0.3
logistic_map(r) r 3.9
# Using helper constructors
params <- standard_map(epsilon = 0.25)
print(params)
# $map
# [1] "standard"
# $epsilon
# [1] 0.25

params <- henon_map()  # uses defaults a=1.4, b=0.3
params <- logistic_map(r = 3.7)

# Use with do.call
traj <- do.call(generate_trajectory, c(
  list(ic = c(0.1, 0.2), n_steps = 1000),
  standard_map(epsilon = 0.3)
))

Harmonic Analysis Functions

harmonic_time_average

Compute the harmonic time average (HTA) of an observable along a trajectory generated by a dynamical map. The HTA is a key tool in Koopman operator theory for extracting frequency-specific information from orbits.

Argument Type Default Description
ic numeric vector -- Initial condition for the trajectory.
map character -- Map name (same choices as generate_trajectory).
observable character -- Observable function. One of "identity", "sin_pi", "cos_pi", "sin_pi_xy", or "quadratic".
omega numeric -- Frequency parameter for the harmonic average.
n_iter integer -- Number of iterations for the time average.
... various -- Map-specific parameters (e.g., epsilon).

Return value. A list with the following components:

Component Type Description
magnitude numeric Magnitude (absolute value) of the harmonic time average.
phase numeric Phase angle of the harmonic time average (radians).
real numeric Real part of the harmonic time average.
imag numeric Imaginary part of the harmonic time average.
library(koopman.dmd)

# HTA of identity observable on standard map
hta <- harmonic_time_average(
  ic = c(0.1, 0.2),
  map = "standard",
  observable = "identity",
  omega = 0.0,
  n_iter = 10000,
  epsilon = 0.12
)
cat("Magnitude:", hta$magnitude, "\n")
cat("Phase:    ", hta$phase, "\n")

mesochronic_compute

Compute harmonic time averages over a grid of initial conditions, producing a mesochronic map of the phase space. This reveals the structure of Koopman eigenfunctions and distinguishes regular from chaotic regions.

Argument Type Default Description
map character -- Map name.
x_range numeric(2) -- Range of x-coordinates as c(x_min, x_max).
y_range numeric(2) -- Range of y-coordinates as c(y_min, y_max).
resolution integer -- Number of grid points along each axis.
observable character -- Observable function (same choices as harmonic_time_average).
omega numeric -- Frequency parameter.
n_iter integer -- Number of iterations for each initial condition.
... various -- Map-specific parameters.

Return value. A list with the following components:

Component Type Description
hta_matrix numeric matrix Matrix of HTA magnitudes over the grid (resolution x resolution).
phase_matrix numeric matrix Matrix of HTA phases over the grid (resolution x resolution).
x_coords numeric vector Vector of x-coordinates for the grid.
y_coords numeric vector Vector of y-coordinates for the grid.
# Mesochronic analysis of the standard map
meso <- mesochronic_compute(
  map = "standard",
  x_range = c(0, 1),
  y_range = c(0, 1),
  resolution = 200,
  observable = "identity",
  omega = 0.0,
  n_iter = 5000,
  epsilon = 0.12
)

# Plot with base R
image(
  meso$x_coords,
  meso$y_coords,
  meso$hta_matrix,
  col = hcl.colors(256, "viridis"),
  xlab = "x",
  ylab = "y",
  main = "Mesochronic Map"
)

classify_phase_space

Classify an initial condition as belonging to a regular or chaotic region of phase space, based on the convergence behavior of the harmonic time average.

Argument Type Default Description
ic numeric vector -- Initial condition.
map character -- Map name.
omega numeric -- Frequency parameter.
n_iter integer -- Number of iterations.
... various -- Map-specific parameters.

Return value. A list with the following components:

Component Type Description
classification character One of "regular", "chaotic", or "boundary".
hta_magnitude numeric Magnitude of the harmonic time average at convergence.
hta_phase numeric Phase of the harmonic time average at convergence.
# Classify a point on the standard map
cls <- classify_phase_space(
  ic = c(0.1, 0.2),
  map = "standard",
  omega = 0.0,
  n_iter = 10000,
  epsilon = 0.12
)
cat("Classification:", cls$classification, "\n")
cat("HTA magnitude: ", cls$hta_magnitude, "\n")

hta_convergence

Track the convergence of the harmonic time average as a function of the number of iterations. Useful for determining the required iteration depth and for visualizing the convergence behavior of regular versus chaotic orbits.

Argument Type Default Description
ic numeric vector -- Initial condition.
map character -- Map name.
observable character -- Observable function.
omega numeric -- Frequency parameter.
max_iter integer -- Maximum number of iterations.
step integer -- Record the HTA magnitude every step iterations.
... various -- Map-specific parameters.

Return value. A data.frame with two columns:

Column Type Description
iteration integer Iteration number at which the magnitude was recorded.
magnitude numeric HTA magnitude at this iteration.
# Track HTA convergence for a regular orbit
conv <- hta_convergence(
  ic = c(0.1, 0.2),
  map = "standard",
  observable = "identity",
  omega = 0.0,
  max_iter = 50000,
  step = 500,
  epsilon = 0.12
)
plot(conv$iteration, conv$magnitude,
     type = "l", xlab = "Iteration", ylab = "HTA Magnitude")

Examples

Complete DMD Workflow

library(koopman.dmd)

# -- Generate synthetic data --
t <- seq(0, 4 * pi, length.out = 200)
data <- rbind(
  sin(t) + 0.1 * sin(5 * t),
  cos(t) + 0.1 * cos(5 * t)
)

# -- Fit DMD --
result <- dmd(data, rank = 4)
print(result)
summary(result)

# -- Prediction --
forecast <- predict(result, n_ahead = 100)
matplot(t(forecast), type = "l", main = "DMD Forecast")

# -- Reconstruction error --
err <- dmd_error(result, data)
cat("RMSE:          ", err$rmse, "\n")
cat("Relative error:", err$relative_error, "\n")

# -- Spectrum --
spec <- dmd_spectrum(result, dt = 0.01)
print(spec)

# -- Stability --
stab <- dmd_stability(result)
cat("Stable:", stab$is_stable, "\n")

# -- Dominant modes --
top <- dmd_dominant_modes(result, n = 3)
print(top)

Hankel-DMD for Scalar Time Series

library(koopman.dmd)

# Scalar time series with two frequencies
t <- seq(0, 20 * pi, length.out = 1000)
data <- matrix(sin(t) + 0.5 * sin(3 * t), nrow = 1)

# Fit Hankel-DMD
hresult <- hankel_dmd(data, delays = 30, rank = 4)
print(hresult)

# Predict and reconstruct
hforecast <- predict(hresult, n_ahead = 200)
hrecon <- hankel_reconstruct(hresult)

# Compare reconstruction to original
plot(data[1, ], type = "l", col = "black", ylab = "x",
     main = "Hankel-DMD Reconstruction")
lines(hrecon[1, ], col = "red", lty = 2)
legend("topright", c("Original", "Reconstructed"),
       col = c("black", "red"), lty = c(1, 2))

GLA Eigenvalue Extraction

library(koopman.dmd)

# Oscillatory data
t <- seq(0, 8 * pi, length.out = 500)
data <- rbind(sin(t), cos(t))

# Extract 4 Koopman eigenvalues with GLA
gresult <- gla(data, n_eigenvalues = 4, tol = 1e-8)
print(gresult)

# Predict and reconstruct
gforecast <- predict(gresult, n_ahead = 100)
grecon <- gla_reconstruct(gresult)

matplot(t(grecon), type = "l", main = "GLA Reconstruction")

Trajectory Generation and Phase Portraits

library(koopman.dmd)

# Standard map phase portrait
par(mfrow = c(1, 2))

# Regular orbit
traj1 <- generate_trajectory(
  ic = c(0.1, 0.2),
  map = "standard",
  n_steps = 5000,
  epsilon = 0.12
)
plot(traj1[1, ], traj1[2, ],
     pch = ".", xlab = "x", ylab = "y",
     main = "Standard Map (regular)")

# Chaotic orbit
traj2 <- generate_trajectory(
  ic = c(0.5, 0.5),
  map = "standard",
  n_steps = 50000,
  epsilon = 0.97
)
plot(traj2[1, ], traj2[2, ],
     pch = ".", xlab = "x", ylab = "y",
     main = "Standard Map (chaotic)")

# Henon attractor
par(mfrow = c(1, 1))
henon <- generate_trajectory(
  ic = c(0.0, 0.0),
  map = "henon",
  n_steps = 10000,
  a = 1.4,
  b = 0.3
)
plot(henon[1, ], henon[2, ],
     pch = ".", xlab = "x", ylab = "y",
     main = "Henon Attractor")

# Logistic map bifurcation diagram
rs <- seq(2.5, 4.0, by = 0.005)
plot(NULL, xlim = c(2.5, 4), ylim = c(0, 1),
     xlab = "r", ylab = "x", main = "Logistic Map Bifurcation")
for (r in rs) {
  traj <- generate_trajectory(
    ic = 0.4, map = "logistic", n_steps = 300, r = r
  )
  points(rep(r, 50), traj[1, 251:300], pch = ".", cex = 0.5)
}

Harmonic Time Averages and Mesochronic Analysis

library(koopman.dmd)

# -- Single-point HTA --
hta <- harmonic_time_average(
  ic = c(0.1, 0.2),
  map = "standard",
  observable = "sin_pi",
  omega = 0.0,
  n_iter = 20000,
  epsilon = 0.12
)
cat("HTA magnitude:", hta$magnitude, "\n")
cat("HTA phase:    ", hta$phase, "\n")

# -- Mesochronic map --
meso <- mesochronic_compute(
  map = "standard",
  x_range = c(0, 1),
  y_range = c(0, 1),
  resolution = 300,
  observable = "cos_pi",
  omega = 0.0,
  n_iter = 10000,
  epsilon = 0.12
)

image(
  meso$x_coords, meso$y_coords, meso$hta_matrix,
  col = hcl.colors(256, "viridis"),
  xlab = "x", ylab = "y",
  main = "Mesochronic Map (cos_pi, omega=0)"
)

# -- Phase space classification --
cls <- classify_phase_space(
  ic = c(0.5, 0.5),
  map = "standard",
  omega = 0.0,
  n_iter = 50000,
  epsilon = 0.97
)
cat("Classification:", cls$classification, "\n")

# -- Convergence tracking --
conv <- hta_convergence(
  ic = c(0.1, 0.2),
  map = "standard",
  observable = "quadratic",
  omega = 0.0,
  max_iter = 100000,
  step = 1000,
  epsilon = 0.12
)
plot(conv$iteration, conv$magnitude,
     type = "l", log = "x",
     xlab = "Iteration", ylab = "HTA Magnitude",
     main = "HTA Convergence")