dynamicslab/pysindy

A package for the sparse identification of nonlinear dynamical systems from data

PySINDy – 稀疏非线性动力系统识别

它是什么:
一个直接从测量数据中发现动力系统控制方程的 Python 库。它实现了 SINDy (Sparse Identification of Nonlinear Dynamics) 算法及几种相关的稀疏回归方法。

为什么重要:
它生成的模型是可解释的(显式方程)且通常是紧凑的,这使得它们在无需黑盒神经网络的情况下,即可用于预测、控制设计或科学洞察。

关键功能

  • 从时间序列快照中拟合连续时间动力系统。
  • 在多种稀疏优化器中进行选择(例如 LASSO, SR3, MIOSR, Bayesian SBR)。
  • 自动构建候选函数库(多项式、三角函数等)。
  • 通过可选扩展内置支持自定义特征库和自定义优化器。
  • 以符号形式、NumPy 函数或 LaTeX 导出发现的方程。

典型工作流程

  1. 收集数据 – 状态测量矩阵 X 和时间向量 t。
  2. 创建模型 – model = pysindy.SINDy()(可选指定优化器、特征库等)。
  3. 拟合 – model.fit(X, t=t)。
  4. 检查 – 使用 model.print() 或 model.coefficients() 查看识别出的方程。
  5. 使用 – 向前模拟、设计控制器或分析符号模型。

安装

pip install pysindy          # 核心包
# 可选优化器
pip install pysindy[miosr]   # 分支定界 L0 优化器
pip install pysindy[cvxpy]    # 凸 SR3 优化器
pip install pysindy[sbr]     # 贝叶斯回归优化器

Conda 用户也可以通过 conda install -c conda-forge pysindy 安装。

最小示例(识别一个简单的线性系统)

import numpy as np
import pysindy as ps

# x' = -2x, y' = y 的合成数据
t = np.linspace(0, 1, 100)
x = 3 * np.exp(-2 * t)
y = 0.5 * np.exp(t)
X = np.column_stack([x, y])

model = ps.SINDy()
model.fit(X, t=t, feature_names=["x", "y"])
model.print()

输出:

x' = -2.000 x
y' =  1.000 y

文档与帮助

相关工具

  • Deeptime – 时间序列分析,马尔可夫模型。
  • PyDMD – 动态模态分解,一种替代的数据驱动建模方法。
  • PySINDyGUI / SEED – 针对相同算法的图形化前端。

适用人群 需要从实验数据中获取物理、生物或工程系统紧凑且易于分析的模型,且优先考虑可解释性而非原始预测能力的科研人员和工程师。

相关

  • 项目
  • 项目
  • 项目
  • 项目