动态模式分解(DMD)

在这里插入图片描述

本文地址:https://goodgoodstudy.blog.csdn.net/article/details/111873026

动态模式分解

动态模式分解(Dynamic Mode Decomposition,DMD)使用随时间增长、衰减和振荡的相干结构来求解或近似动力学系统。将相干结构称为DMD模式。换句话说,DMD将动力学系统转换为模式的叠加,每个模式的强度由特征值控制。

令人惊讶的是,尽管识别DMD模式和特征值的数学过程是纯线性的,但系统本身却可以是非线性的!

有一个合理的理论基础可以证明非线性系统可以用一组模式和特征值对来描述。在这里不多做讨论,感兴趣的话,可以阅读 Koopman 算子及其与DMD的联系123

DMD不仅是分析系统内部运行情况的有用诊断工具,而且还可以用于预测系统的未来状态。所需要的只是模式和特征值。

正式描述

考虑一组 n n n 个数据对 { ( x 0 , y 0 ) , ( x 1 , y 1 ) , … , ( x n , y n ) } \{(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)\} {(x0,y0),(x1,y1),,(xn,yn)},其中 x i x_i xi y i y_i yi 是长度为 m m m 的列向量。现在,我们定义两个 m × n m \times n m×n 矩阵:
X = [ x 0 x 1 … x n ] , Y = [ y 0 y 1 … y n ] X = \begin{bmatrix}x_0 & x_1 & \ldots & x_n\end{bmatrix}, Y = \begin{bmatrix}y_0 & y_1 & \ldots & y_n\end{bmatrix} X=[x0x1xn],Y=[y0y1yn]

如果我们将符号 A A A 定义为
A = Y X † A = YX^{\dagger} A=YX
其中 X † X^{\dagger} X X X X的伪逆4,则对 ( X , Y ) (X, Y) (X,Y) 的动态模式分解由 A A A 的特征分解给出:即DMD模式和特征值是A的特征向量和特征值。

上面的定义来自 (Tu et al)2 ,被称为 exact DMD。它是当前最通用的定义,可以应用于满足给定要求的任何数据集。

在这篇文章中,我们对A满足(或近似满足)方程 y i = A x i , ∀ i y_i = Ax_i, \forall i yi=Axi,i的情况最感兴趣:
Y = A X Y =AX Y=AX
X X X 是一组输入向量, Y Y Y是相应的输出向量集合。 DMD的这种表述非常强大,因为它为分析(和预测)控制方程未知的动力学系统提供了一种便捷的方法。

DMD算法

乍一看,寻找 A = Y X † A = YX^{\dagger} A=YX 的特征分解的任务似乎没什么大不了的。确实,当 X X X Y Y Y 的大小合理时,从 Numpy 或 MATLAB 调用pinveig方法可以解决问题。当 A ∈ R m × m A \in \mathbb{R}^{m \times m} ARm×m 确实很大时,特征分解可能变得麻烦。

幸运的是,借助 exact DMD算法,可以将问题分解为如下几个子任务。

  1. X X X 奇异值分解,可以选择同时执行低阶截断:
    X = U Σ V ∗ X =U\Sigma V^∗ X=UΣV易知 X † = V Σ − 1 U ∗ , A = Y V Σ − 1 U ∗ X^{\dagger} = V\Sigma^{-1} U^∗, A = YV\Sigma^{-1} U^∗ X=VΣ1U,A=YVΣ1U.

  2. 计算 A ~ \tilde{A} A~,即将完整矩阵 A A A 投影到 U U U 上:
    A ~ = U ∗ A U = U ∗ Y X † U = U ∗ Y V Σ − 1 \tilde{A} = U^*AU = U^*YX^{\dagger}U=U^*YV\Sigma^{-1} A~=UAU=UYXU=UYVΣ1

  3. 计算 A ~ \tilde{A} A~ 的特征值 λ i \lambda_i λi 和特征向量 w i w_i wi
    A ~ W = W Λ \tilde{A}W =W\Lambda A~W=WΛ

  4. W W W Λ \Lambda Λ 重构 A A A 的特征分解。 A A A的特征值等于 A ~ \tilde{A} A~ 的特征值。 A A A 的特征向量由 Φ \Phi Φ 的列给出:
    A Φ = Φ Λ , Φ = Y V Σ − 1 W A\Phi = \Phi \Lambda,\Phi = YV\Sigma^{-1}W AΦ=ΦΛΦ=YVΣ1W
    因为
    A Φ = Y V Σ − 1 U ∗ Y V Σ − 1 W = Y V Σ − 1 A ~ W = Y V Σ − 1 W Λ = Φ A \begin{aligned} A\Phi &= YV\Sigma^{-1} U^∗YV\Sigma^{-1}W \\ &= YV\Sigma^{-1}\tilde{A} W \\ &= YV\Sigma^{-1} W \Lambda \\ &= \Phi A \end{aligned} AΦ=YVΣ1UYVΣ1W=YVΣ1A~W=YVΣ1WΛ=ΦA

在参考文献12中可以找到对该算法推导的更深入的解释。以上是 exact DMD模式。

从理论上讲, Φ ∘ = U W \Phi^\circ = UW Φ=UW Φ \Phi Φ 的另一推导,也称为 projected DMD 模式:
A Φ ∘ = Y V Σ − 1 U ∗ U W = Y V Σ − 1 W = U U ∗ Y V Σ − 1 W = U A ~ W = U W Λ = Φ ∘ Λ \begin{aligned} A\Phi^\circ &= YV\Sigma^{-1} U^∗UW \\ &= YV\Sigma^{-1}W \\ &=U U^∗YV\Sigma^{-1} W \\ &= U \tilde{A} W \\ &= U W \Lambda \\ &= \Phi^\circ \Lambda \end{aligned} AΦ=YVΣ1UUW=YVΣ1W=UUYVΣ1W=UA~W=UWΛ=ΦΛ

动态系统

本文仅考虑方程式 Y = A X Y = AX Y=AX 的两种解释。

第一种解释是 A A A定义了一个差分方程:
x i + 1 = A x i x_{i + 1} = Ax_i xi+1=Axi
在这种情况下,算子 A A A 动态系统状态 x i x_i xi 在时间上向前迈出了一步。

假设我们有一个时间序列 D D D
D = [ x 0 x 1 … x n + 1 ] D = \begin{bmatrix}x_0 & x_1 & \ldots & x_{n+1}\end{bmatrix} D=[x0x1xn+1]
其中 x i x_i xi 是在时间步 i i i 处定义系统的 m m m 维状态的列向量。可以这样定义 X X X Y Y Y
X = [ x 0 … x n ] , Y = [ x 1 … x n + 1 ] X = \begin{bmatrix}x_0 & \ldots & x_{n}\end{bmatrix}, \quad Y = \begin{bmatrix} x_1 & \ldots & x_{n+1}\end{bmatrix} X=[x0xn],Y=[x1xn+1]
这样,来自 X X X Y Y Y 的每对列向量对应于差分方程式的单次迭代:
Y = A X Y = AX Y=AX
使用DMD,计算特征分解 A Φ = Φ Λ AΦ=ΦΛ AΦ=ΦΛ。掌握了DMD模式和特征值,动态系统的状态方程可写成:
x k + 1 = A x k = Φ Λ Φ † x k x_{k+1} = Ax_k = ΦΛΦ^\dagger x_k xk+1=Axk=ΦΛΦxk
因此系统状态关于时间步 k k k 的表达式为:
x k = Φ Λ k Φ † x 0 x_k =ΦΛ^kΦ^\dagger x_0 xk=ΦΛkΦx0
若离散时间步长为 Δ t Δt Δt,连续时间 t t t 中的对应函数为
x ( t ) = Φ Λ t / Δ t Φ † x ( 0 ) x(t) = ΦΛ^{t/\Delta t}Φ^\dagger x(0) x(t)=ΦΛt/ΔtΦx(0)

真正令人惊讶的是,仅使用数据就及时定义了显式函数!这是无方程式建模的一个很好的例子。

本文讨论的 Y = A X Y = AX Y=AX 的第二种解释是 A A A定义了一个微分方程组:
x ˙ = A x \dot{x}= Ax x˙=Ax
在这种情况下,矩阵 X X X Y Y Y 将由向量场的 n n n 个样本组成: X X X 的第 i i i 列是位置向量 x i x_i xi Y Y Y 的第 i i i 列是速度向量 x ˙ \dot{x} x˙

在计算DMD之后,时间函数与之前差分方程的情形非常相似。如果 x ( 0 ) x(0) x(0) 是任意初始条件,而 t t t 是连续时间,则
x ( t ) = Φ exp ⁡ ( Λ t ) Φ † x ( 0 ) x(t) = Φ\exp(Λt) Φ^\dagger x(0) x(t)=Φexp(Λt)Φx(0)

参考文献

在这里插入图片描述


  1. Kutz, J. Nathan. Data-driven modeling & scientific computation: methods for complex systems & big data. OUP Oxford, 2013. ↩︎ ↩︎

  2. Tu, Jonathan H., et al. “On dynamic mode decomposition: theory and applications.” arXiv preprint arXiv:1312.0041 (2013). ↩︎ ↩︎ ↩︎

  3. Wikipedia contributors. “Composition operator.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 28 Dec. 2015. Web. 24 Jul. 2016. ↩︎

  4. Wikipedia contributors. “Moore–Penrose pseudoinverse.” Wikipedia, The Free Encyclopedia. Wikipedia, The Free Encyclopedia, 12 May. 2016. Web. 24 Jul. 2016. ↩︎

### 回答1: DMD是Dynamic Mode Decomposition的缩写,是一种用于分解和分析动态系统的方法。下面是一个用Matlab编写的DMD程序的解释: DMD程序的第一步是导入所需的库和数据。这些库包括导入和处理数据的工具箱,以及用于执行矩阵运算和函数的函数包。数据是动态系统的观测数据,可以是一个时间序列或一个矩阵。 接下来,程序将观测数据转化为两个矩阵,一个用于训练,另一个用于测试。这样可以用训练数据来寻找系统的动态模式,并用测试数据来验证分解的模型的准确性。 在DMD算法的核心部分,程序使用训练数据估计系统的动态模式。这包括计算数据的特征值和特征向量,然后根据这些特征值和特征向量构建DMD模型。 程序接着使用DMD模型和测试数据来预测系统的未来状态。这可以通过将测试数据转化为DMD正交模态和使用动态模式DMD模型进行重构来实现。 最后,程序将DMD预测结果与真实的测试数据进行比较,评估模型的准确性和性能。评估指标包括平均误差、均方根误差等。 整个DMD程序的流程是:导入库和数据 -> 将数据分为训练集和测试集 -> 用训练数据估计动态模式 -> 构建DMD模型 -> 使用DMD模型预测系统的未来状态 -> 评估模型的准确性和性能。 以上就是一个大致的DMD程序的解释,它能够帮助我们分析和理解动态系统的性质和行为。利用DMD技术,我们可以对观测数据进行分解并得到系统的动态模式,进一步预测系统的未来状态。这对于许多领域的应用,如信号处理、控制系统和气象预报等,都具有重要的价值。 ### 回答2: DMD分解(Dynamic Mode Decomposition)是一种用于提取动态系统中的模态特征的数学方法。通过DMD分解,我们可以获得系统的特征向量和特征值,这些特征向量描述了系统中的主要动态模式DMD分解的Matlab程序可以分为以下几个步骤: 1. 导入数据:将需要进行DMD分解的数据导入Matlab环境中。这些数据可以是任何包含动态系统信息的时间序列数据,比如位移、速度或者温度数据等。 2. 数据预处理:对导入的数据进行必要的预处理,例如去除噪音、平滑数据或者对数据进行标准化。这样可以提高DMD分解的准确性和可靠性。 3. 构建数据矩阵:将预处理后的数据按照一定的时间窗口大小和重叠率构建数据矩阵。这个矩阵的行对应不同的时间点,列对应不同的测量变量。 4. DMD分解:使用Matlab内置的DMD函数对数据矩阵进行DMD分解。该函数可以计算出特征向量和特征值。 5. 特征提取:根据得到的特征向量和特征值,可以提取系统中的模态特征。这些特征向量代表了系统中不同的动态模式,特征值则表示了这些动态模式的动态特性。 6. 结果可视化:根据需要,可以使用Matlab的绘图函数将DMD分解的结果进行可视化,比如绘制模态分布或者重构出原始数据。 总之,DMD分解的Matlab程序可以帮助我们从动态系统的数据中提取出模态特征,进一步理解和分析系统的动态行为。通过动态模式的提取和可视化,可以更好地认识和预测系统的演化过程。 ### 回答3: dmd(Dynamic Mode Decomposition)是一种信号分解方法,用于对时间序列数据进行模态分解。它的原理是基于对数据矩阵的奇异值分解(SVD)和动力学分析,用来寻找数据中的动力学模式。 在MATLAB中实现dmd分解,可以按照以下步骤进行: 1. 首先,将时间序列数据转化为数据矩阵。假设我们有N个时间步和M个测量点,可以将数据组织成一个M×N的矩阵X。 2. 对数据矩阵X进行奇异值分解,得到X = UΣV^T。其中U和V分别是正交矩阵,并且Σ是一个对角矩阵,对角线上的元素是奇异值。可以使用MATLAB中的函数svd()来计算矩阵的奇异值分解。 3. 根据奇异值Σ,选择一个截断点r。可以根据奇异值的大小来选择截断点,通常可以选择前r个奇异值。这样,我们可以得到X的低秩近似X_r = U(:, 1:r)Σ(1:r, 1:r)V(:, 1:r)^T。 4. 计算低秩近似矩阵X_r的延迟数据矩阵X_r1和X_r2。可以通过下面的公式计算延迟数据矩阵: X_r1 = X_r(:, 1:N-1) X_r2 = X_r(:, 2:N) 5. 根据延迟数据矩阵X_r1和X_r2计算伪逆矩阵,并且乘以X_r2,得到逼近矩阵A: A = X_r2 * pinv(X_r1) 6. 对矩阵A进行特征值分解,得到特征值lambda和特征向量v。可以使用MATLAB中的函数eig()来计算特征值和特征向量。 通过上述步骤,我们可以得到dmd分解的结果。根据特征值和特征向量,我们可以推断数据中的动力学模式,并且可以根据这些模式做出预测和分析。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值