clvlib is a library for computing Lyapunov exponents and Covariant Lyapunov Vectors (CLVs) with NumPy and PyTorch. Lyapunov exponents are computed using Benettin's algorithm [1]. The NumPy implementation uses a sign-corrected Householder QR step for re-orthonormalisation, and the CLVs are computed using Ginelli's algorithm [2].
The variational stepper used to integrate the variational system is modular. Standard Euler, RK2, RK4, and discrete-time steppers are bundled, but you can register your own functions for the integrators.
pip install clvlibInstall the PyTorch backend only if you need it:
pip install "clvlib[pytorch]"import numpy as np
from clvlib.numpy import lyap_analysis_from_ic
# Lorenz '63 system ----------------------------------------------------------
SIGMA = 10.0
RHO = 28.0
BETA = 8.0 / 3.0
def lorenz(t: float, x: np.ndarray) -> np.ndarray:
return np.array(
[
SIGMA * (x[1] - x[0]),
x[0] * (RHO - x[2]) - x[1],
x[0] * x[1] - BETA * x[2],
],
dtype=float,
)
def jacobian(t: float, x: np.ndarray) -> np.ndarray:
return np.array(
[
[-SIGMA, SIGMA, 0.0],
[RHO - x[2], -1.0, -x[0]],
[x[1], x[0], -BETA],
],
dtype=float,
)
times = np.linspace(0.0, 40.0, 4001)
x0 = np.array([8.0, 0.0, 30.0], dtype=float)
LE, LE_history, Q_history, R_history, clv_history, D_history, traj = lyap_analysis_from_ic(
lorenz,
jacobian,
x0,
times,
stepper="rk4",
)
print("Asymptotic Lyapunov exponents:", LE)See tutorials/lorenz_numpy_quickstart.ipynb for the NumPy walkthrough, and tutorials/lorenz_pytorch_quickstart.ipynb for the PyTorch version.
Want only the most unstable directions? Pass n_lyap=k to any of the Lyapunov helpers (lyap_exp, lyap_analysis, and their _from_ic counterparts) to compute just the leading k exponents/BLVs/CLVs.
from clvlib.numpy import compute_angles, principal_angles, compute_ICLE
# Pairwise vector angles
cosine, theta = compute_angles(clv_history[:, :, 0], clv_history[:, :, 1])
# Principal angles between subspaces
angles = principal_angles(clv_history[:, :, -1:], clv_history[:, :, :-1])
# Instantaneous covariant exponents sampled every k_step iterations
icle = compute_ICLE(jacobian, traj, times, clv_history, k_step=1)If clvlib contributes to your published work, please cite it as:
@software{consonni_clvlib_2025,
author = {Riccardo Consonni, Luca Magri},
title = {clvlib: a library to compute covariant Lyapunov vectors},
year = {2026},
publisher = {Zenodo},
doi = {10.5281/zenodo.19763144},
url = {https://doi.org/10.5281/zenodo.19763144},
}
Published under the MIT License. See LICENSE for the full text.
[1] Benettin, G., Galgani, L., Giorgilli, A., & Strelcyn, J.-M. (1980). Lyapunov characteristic exponents for smooth dynamical systems and for Hamiltonian systems; a method for computing all of them. Part 1: Theory. Meccanica, 15(1), 9–20.
[2] Ginelli, F., Poggi, P., Turchi, A., Chaté, H., Livi, R., & Politi, A. (2007). Characterizing dynamics with covariant Lyapunov vectors. Physical Review Letters, 99(13), 130601.