非线性动力学的稀疏识别
项目描述
PySINDy是一个稀疏回归包,具有多种实现,用于在 Brunton 等人中引入的非线性动力系统的稀疏识别 (SINDy) 方法。(2016a),包括 Champion 等人的统一优化方法。(2019),SINDy,由 Brunton 等人控制。(2016b),从 Kaptanoglu 等人捕获 SINDy。(2021),来自 Kaheman 等人的 SINDy-PI。(2020),来自 Rudy 等人的 PDE-FIND。(2017)等等。de Silva 等人给出了全面的文献综述。(2020) 和 Kaptanoglu、de Silva 等人。(2021 年)。
<nav class="contents" id="table-of-contents" role="doc-toc">目录
系统识别
系统识别是指利用测量数据以动力系统的形式推断控制方程,描述数据的过程。一旦被发现,这些方程可以预测未来状态,可以为控制输入提供信息,或者可以使用分析技术进行理论研究。动态系统是一类灵活的、经过充分研究的数学对象,用于对随时间演化的系统进行建模。SINDy 是一种模型发现方法,它使用稀疏回归从测量数据中推断出非线性动力系统。生成的模型本质上是可解释和可推广的。
这个怎么运作
假设,对于某个感兴趣的物理系统,我们在不同时间点测量了状态变量x(t) (长度为 n 的向量)。状态变量的示例包括对象的位置、速度或加速度;气动物体的升力、阻力或迎角;和不同化学物质的浓度。如果我们怀疑系统可以通过以下形式的动力系统很好地建模
x'(t) = f(x(t)),
然后我们可以使用 SINDy从数据中学习f(x) ( x'(t)表示x (t)的时间导数)。请注意,f(x)和x(t)通常都是向量。SINDy 采用的基本假设是f(x)和f_i(x)的每个分量都可以表示为基函数theta_j(x)的稀疏线性组合
f_i(x) = theta_1(x) * xi_{1,i} + theta_2(x) * xi_{2,i} + ... + theta_k * xi{k,i}
将所有对象连接成矩阵(用大写名称表示)有助于简化事情。为此,我们将状态变量的所有测量值放入数据矩阵X(每次测量一行,每个变量一列),状态变量的导数放入矩阵X'中,所有基函数在时间到矩阵Theta(X)(每个基函数得到一列),所有系数到第三个矩阵Xi(每个状态变量一列)。待解决的近似问题可以紧凑地写为
X' = Theta(X) * Xi.
该矩阵方程的每一行对应于f(x)的一个坐标函数。SINDy 采用稀疏回归技术来找到具有稀疏列向量的解Xi 。如需更深入地了解 SINDy 的数学基础,请参阅我们对 SINDy 的介绍。
与 PySINDy 的关系
PySINDy 包围绕着由三个主要组件组成的SINDy类;对于上述矩阵逼近问题中的每一项。
Difference_method:计算X',但如果导数已知或直接测量,则可以使用它们代替
feature_library:指定用于构造Theta(X)的候选基函数
优化器:实现用于求解Xi的稀疏回归方法
创建SINDy对象后,它必须适合测量数据,类似于scikit-learn模型。然后,它可以用于在给定新测量值的情况下预测导数,及时演化新的初始条件等等。PySINDy 已被编写为尽可能与scikit-learn对象和方法兼容。
例子
假设我们测量了粒子在不同时间点服从以下动力系统的位置
x' = -2x
y' = y
请注意,这个微分方程系统解耦为两个微分方程,其解只是x(t) = x_0 * exp(-2 * t)和y(t) = y_0 * exp(t),其中x_0 = x(0)和y_0 = y(0)是初始条件。
使用初始条件x_0 = 3和y_0 = 0.5,我们构造数据矩阵X。
import numpy as np
import pysindy as ps
t = np.linspace(0, 1, 100)
x = 3 * np.exp(-2 * t)
y = 0.5 * np.exp(t)
X = np.stack((x, y), axis=-1) # First column is x, second is y
为了使用默认的微分方法、特征库和优化器实例化一个SINDy对象,然后将其拟合到数据中,我们调用
model = ps.SINDy(feature_names=["x", "y"])
model.fit(X, t=t)
我们使用feature_names参数,以便模型为x和y打印出正确的标签。我们可以检查模型发现的控制方程,并使用打印函数检查它们是否合理。
model.print()
打印以下内容
x' = -2.000 x
y' = 1.000 y
PySINDy 提供了许多其他未在此处显示的功能。我们推荐文档的功能概述部分,以获得更详尽的附加功能摘要。
安装
使用 pip 安装
如果您使用的是 Linux 或 macOS,您可以使用 pip 安装 PySINDy:
pip install pysindy
从源安装
首先克隆这个存储库:
git clone https://github.com/dynamicslab/pysindy.git
然后,要安装包,运行
pip install .
如果您没有 pip,则可以改用
python setup.py install
如果您没有 root 访问权限,则应在上述行中添加--user选项。
注意事项
如果您想使用SINDy-PI优化器、Trapping SINDy优化器 (TrappingSR3) 或其他具有不等式约束的 SR3 优化,您还需要安装 cvxpy 包,例如使用pip install cvxpy。
要运行单元测试、示例笔记本或构建文档的本地副本,您应该在requirements-dev.txt中安装其他依赖项
pip install -r requirements-dev.txt
文档
PySINDy 的文档站点可以在这里找到。有许多PySINDy示例可帮助您入门。示例也可用作Jupyter 笔记本。可以在Youtube 上找到 PySINDy 的视频概述。我们还创建了一个包含实用 PySINDy 技巧的视频播放列表。
PySINDy 实现了许多高级功能,对于新用户或不熟悉这些方法的人来说可能会不知所措。下面(如果图像不呈现,请参见此处https://github.com/dynamicslab/pysindy/blob/master/docs/JOSS2/Fig3.png),我们提供了一个有用的流程图,用于根据特征确定使用哪些方法您的数据集:
此流程图总结了PySINDy用户如何从数据集开始,并系统地选择适合特定科学任务的候选库和稀疏回归优化器。GeneralizedLibrary类允许张量、连接和以其他方式组合许多不同的候选库。
社区准则
贡献的例子
我们喜欢看到 PySINDy 用于解决有趣问题的示例!如果您想提供示例,请通过创建问题与我们联系。
贡献代码
我们欢迎对 PySINDy 的贡献。要贡献新功能,请提交拉取请求。要开始使用,我们建议通过安装 requirements-dev.txt 中的包
pip install -r requirements-dev.txt
这将允许您运行单元测试并自动格式化您的代码。要被接受,您的代码应符合 PEP8 并通过所有单元测试。代码可以通过调用来测试
pytest
我们建议使用预提交来格式化您的代码。一旦您将更改分阶段提交
git add path/to/changed/file.py
您可以运行以下命令来自动重新格式化暂存代码
pre-commit
请注意,您将需要重新暂存任何预先提交对您的代码所做的更改。
有许多 SINDy 变体和高级功能可以很好地在未来的版本中实现:
贝叶斯 SINDy,例如来自 Hirsh、Seth M.、David A. Barajas-Solano 和 J. Nathan Kutz 的。“模型发现中贝叶斯不确定性量化的稀疏先验”。arXiv 预印本 arXiv:2107.02107 (2021)。
张量 SINDy,使用 Gelß、Patrick 等人中的方法。“非线性动力系统的多维逼近。” 计算和非线性动力学杂志 14.6 (2019)。
随机 SINDy,使用 Brückner、David B.、Pierre Ronceray 和 Chase P. Broedersz 中的方法。“推断欠阻尼随机系统的动力学。” 物理审查信件 125.5 (2020): 058103。
PySINDy 与 Python 模型预测控制 (MPC) 代码的集成。
PySINDy 弱公式基于 Reinbold、Patrick AK、Daniel R. Gurevich 和 Roman O. Grigoriev 的工作。“使用嘈杂或不完整的数据来发现时空动态模型。” Physical Review E 101.1 (2020): 010203。另外实施 Messenger、Daniel A. 和 David M. Bortz 的弱公式可能会很有用。“偏微分方程的弱 SINDy。” Journal of Computational Physics (2021):110525。PySINDy 中的弱公式也相当慢且计算量很大,因此找到加速代码的方法会很棒。
用于解决受约束 LASSO 问题的混合条件梯度 (BCG) 算法,Carderera,Alejandro 等人。“CINDy:基于条件梯度的非线性动力学识别——抗噪恢复。” arXiv 预印本 arXiv:2101.02630 (2021)。
报告问题或错误
如果您在代码中发现错误或想要请求新功能,请打开一个问题。
获得帮助
引用 PySINDy
PySINDy 已发表在开源软件杂志 (JOSS) 上。论文可以在这里找到。
如果您在工作中使用 PySINDy,请使用以下两个参考文献引用它:
Brian M. de Silva、Kathleen Champion、Markus Quade、Jean-Christophe Loiseau、J. Nathan Kutz 和 Steven L. Brunton。,(2020 年)。PySINDy:用于从数据中稀疏识别非线性动力系统的 Python 包。开源软件学报, 5(49), 2104, https://doi.org/10.21105/joss.02104
Kaptanoglu 等人,(2022 年)。PySINDy:一个全面的 Python 包,用于强大的稀疏系统识别。开源软件杂志, 7(69), 3994, https://doi.org/10.21105/joss.03994
中文提供:
@article{desilva2020,
doi = {10.21105/joss.02104},
url = {https://doi.org/10.21105/joss.02104},
year = {2020},
publisher = {The Open Journal},
volume = {5},
number = {49},
pages = {2104},
author = {Brian de Silva and Kathleen Champion and Markus Quade and Jean-Christophe Loiseau and J. Kutz and Steven Brunton},
title = {PySINDy: A Python package for the sparse identification of nonlinear dynamical systems from data},
journal = {Journal of Open Source Software}
}
中文提供:
@article{Kaptanoglu2022,
doi = {10.21105/joss.03994},
url = {https://doi.org/10.21105/joss.03994},
year = {2022},
publisher = {The Open Journal},
volume = {7},
number = {69},
pages = {3994},
author = {Alan A. Kaptanoglu and Brian M. de Silva and Urban Fasel and Kadierdan Kaheman and Andy J. Goldschmidt and Jared Callaham and Charles B. Delahunt and Zachary G. Nicolaou and Kathleen Champion and Jean-Christophe Loiseau and J. Nathan Kutz and Steven L. Brunton},
title = {PySINDy: A comprehensive Python package for robust sparse system identification},
journal = {Journal of Open Source Software}
}
参考
de Silva、Brian M.、Kathleen Champion、Markus Quade、Jean-Christophe Loiseau、J. Nathan Kutz 和 Steven L. Brunton。 PySINDy:一个 Python 包,用于从数据中稀疏识别非线性动力学。arXiv 预印本 arXiv:2004.08424 (2020) [arXiv]
Kaptanoglu, Alan A., Brian M. de Silva, Urban Fasel, Kadierdan Kaheman, Andy J. Goldschmidt Jared L. Callaham, Charles B. Delahunt, Zachary G. Nicolaou, Kathleen Champion, Jean-Christophe Loiseau, J. Nathan Kutz,和史蒂文 L. 布伦顿。 PySINDy:一个全面的 Python 包,用于强大的稀疏系统识别。 arXiv 预印本 arXiv:2111.08481 (2021)。 [arXiv]
Brunton、Steven L.、Joshua L. Proctor 和 J. Nathan Kutz。 通过非线性动力系统的稀疏识别从数据中发现控制方程。美国国家科学院院刊 113.15 (2016): 3932-3937。 [DOI]
Champion, K.、Zheng, P.、Aravkin, AY、Brunton, SL 和 Kutz, JN (2020)。 一个统一的稀疏优化框架,用于从数据中学习简约的物理信息模型。IEEE 访问,8, 169259-169271。 [DOI]
Brunton、Steven L.、Joshua L. Proctor 和 J. Nathan Kutz。 带控制的非线性动力学的稀疏识别(SINDYc)。 IFAC-PapersOnLine 49.18(2016 年):710-715。 [DOI]
Kaheman, K.、Kutz, JN 和 Brunton, SL (2020)。 SINDy-PI:一种用于非线性动力学并行隐式稀疏识别的鲁棒算法。皇家学会学报 A,476(2242),20200279。 [DOI]
Kaptanoglu, AA, Callaham, JL, Aravkin, A., Hansen, CJ 和 Brunton, SL (2021)。 促进二次非线性动力学数据驱动模型的全局稳定性。 物理评论流体,6(9),094401。 [DOI]
贡献者
感谢为 PySINDy 做出贡献的社区成员!
错误修复#68 |
|
库的连接功能#72 |
|