采用POD以及DMD方法实现圆柱绕流流动分解(DMD篇)
前言
此文是采用POD以及DMD方法实现圆柱绕流流动分解(POD篇)的姊妹篇,本打算合成一篇来写,感觉篇幅太长,因此将本文单独拆出,以飨读者。
上文讲了POD方法降阶处理圆柱绕流问题,POD方法的实质是将随时间变化的原始信号(流场)投影到一组随时间变化的,相互正交的空间信号(流场)的叠加。分解后的模态正交性是其最大的特点。为了保证空间模态的正交性,所对应的时间系数序列有时会包含多个频率成分,分解后的各阶模态有时候很难去解释,这也是它较大的局限所在;此外,分解后的模态尝尝按照能量大小进行排序,未考虑各模态的动态特性的影响。
而DMD方法则可以得到的每阶模态对应单一频率,进而可分析单一流动行为的具体特征和变化规律。DMD 的基本思路是将流动演化视为线性动力学过程,通过分析流动过程中的流场快照得到各阶模态。该方法基于一个最佳拟合流场动态特性的线性算子,将流场分解成若干具有单一特征频率和增长/衰减率的模态, 进而得到流场在时间和空间的主要特征。 当然DMD方法也存在很多问题,比如说特征值排序问题,有兴趣的同学可以看下Brunton大神的相关参考文献。
DMD方法
关于圆柱绕流案例的详细参数,在采用POD以及DMD方法实现圆柱绕流流动分解(POD篇)中已经详细介绍,这里就不再赘述。经典DMD算法的代码详见下面的代码块。DMD相关基础知识的学习可以参见大佬hyhhyh21相关博文内容,讲解的非常清楚,看完后代码就可以自己写出来,向大佬致敬!
function [Dd,b,Phi,Time_DMD,Energy]=DMD_CLASS_M(X,Y)
%by mingbule 2022.2.22
%DMD经典算法
%输入变量X,Y分别为时空矩阵Uxt的1~N-1列以及2~N列
%输出变量Db为经过DMD分解后排序过的特征值
%输出变量b为模态对应的初始结果,与模态相乘后可得初始结果Ux1
%输出变量time_DMD为分解后的时间序列(已排序)
%输出变量Phi为DMD分解后的模态结果(已排序)
%输出变量Energy为DMD分解后的模态能力值(已排序)
N=size(X,2);
%Step1:对X进行svd分解
[U,S,V]=svd(X,'econ');
Sd=diag(S);%将N-1*N-1对角矩阵转换为N-1列矩阵
r=sum(Sd>1e-6);%筛选出奇异值大于1e-6的数量,逻辑变量求和,避免存在接近0值使得计算出现问题
U=U(:,1:r);
S=S(1:r,1:r);
V=V(:,1:r);
%Step2:获得转换矩阵A
A=U'*Y*V/S;
%Step3:求矩阵A的特征向量及特征值
[Om,La]=eig(A);
Dd=diag(La);
%Step4:计算DMD模态
Phi=Y*V/S*Om;
%Step5:计算模态对应的初始值b
b=Phi\X(:,1);
%Step6:模态排序(按照能量大小排序)
Q=Dd.^(0:N-1);%建立范德蒙矩阵来储存特征值变化
Time_DMD=b.*Q;%获取模态对应的时间系数
Energy=zeros(size(Phi,2),1);
for k=1:size(Phi,2)Uxt_DMD_k=real(Phi(:,k)*Time_DMD(k,:));Energy(k)=sum(sum(Uxt_DMD_k.^2));
end
[Energy,index]=sort(Energy,'descend');
Dd=Dd(index);
b=b(index);
Phi=Phi(:,index);
Time_DMD=Time_DMD(index,:);
end
后处理结果
模态分解结果
DMD1阶模态,与POD分解中的平均流场一致
DMD2阶模态(对应POD1阶)
DMD4阶模态(对应POD3阶)
DMD6阶模态(对应POD5阶)
DMD8阶模态(对应POD7阶)
DMD10阶模态(对应POD9阶)
可以看出,上述圆柱绕流流动经过DMD分解得到的模态结果与POD方法得到的模态基本一致,这也与文献【2】中的结论一致(虽然大多数情况下,两者的分解结果不同)。
前6阶模态流场恢复
特征根分布
频率-衰减率分析
频率-能量图
衰减率-能量图
后处理的方法与POD方法基本类似,因此代码就不再贴出,大家掌握了POD的处理方法,可以自己尝试着写出这些后处理的代码。
需要指出的是,DMD方法存在一个特征值排序的问题,目前没有非常通用的方法排序方法,比如某个模态初始的能量很高,但它衰减比较快,可能一定时间后就不太显著,但本文中后处理多个分析图可知,具有较大能量的前几阶模态衰减率为零,稳稳的分布在单位圆上,而许多低能量的高阶模态则分布在圆内,表示随着时间变化而衰减。感兴趣的同学可以尝试着对各阶模态的能量进行排序。由频率图可知,DMD方法可以对每个模态对应单一频率,能够更方便地识别流动结构,分析流动机理。
通过这两篇文章的案例以及文献【3,4】中的典型信号处理案例,相信大家可以比较清晰的掌握POD以及DMD这两种模型降阶方法,在此基础之上,有特殊需求的同学可以就相关知识进行更加深入的学习。在这里权当抛砖引玉,期待与大家交流~
参考文献1234
J.N. Kutz, S.L. Brunton, B.W. Brunton, J.L. Proctor, Dynamic mode decomposition: data-driven modeling of complex systems, SIAM2016. ↩︎
K. Taira, M.S. Hemati, S.L. Brunton, Y. Sun, K. Duraisamy, S. Bagheri, S.T. Dawson, C.-A. Yeh, Modal analysis of fluid flows: Applications and outlook, AIAA journal, 58 (2020) 998-1022. ↩︎
利用matlab实现POD分解(在一维信号或二维流场矢量中的应用) ↩︎
利用matlab实现DMD动态模态分解(在一维信号或二维流场矢量中的应用) ↩︎
采用POD以及DMD方法实现圆柱绕流流动分解(DMD篇)相关推荐
- 采用POD以及DMD方法实现圆柱绕流流动分解(POD篇)
背景 笔者通过对POD及DMD两种模型降阶方法进行学习后,尝试对Brunton大佬书中Re=100圆柱绕流case进行复现,现将学习及复现过程的代码及结果进行分享,希望多提宝贵建议. 本文圆柱绕流案例 ...
- 采用 MRT-LBM 模拟旋转圆柱绕流---MATLAB代码--王富海2017--基于 MRT-LBM 的流场与声场仿真计算
%这个例子采用 MRT-LBM 模拟旋转圆柱绕流 %基于 MRT-LBM 的流场与声场仿真计算 --王富海2017 %左边速度边界-泊肃叶流,右边压力边界,上下无滑移壁面(全部用非平衡外推格式) %还 ...
- catia圆柱转化为圆台_浅析actran气动噪声仿真技术,以圆柱绕流气动噪声仿真为例...
一.写在前面Actran是fft(Free Field Technologies)公司的旗舰产品,"号称"市场上最先进最完善的声学模拟软件(引用官方语言),覆盖振动声学和流动声学的 ...
- fluent瞬态计算终止条件在哪里设置_Fluent案例7【圆柱绕流】
一个瞬态的圆柱绕流案例 知识点: 瞬态圆柱绕流的模拟 一个后处理的方法:将瞬态模型中一个点的速度变化绘成图表并将数值导出excel文件 模型如下图所示,左边界为速度边界进口速度0.5m/s,试模拟出计 ...
- Fluent UDF 实现用Newmark-β方法计算圆柱绕流流固耦合时的位移振动响应
Fluent UDF 实现用Newmark-β方法计算圆柱绕流流固耦合时的位移振动响应 问题描述 代码 尚未解决的问题 问题描述 拟用Fluent模拟圆柱振子在不同流速的风作用下的横向振动.采用二维模 ...
- 浅析actran气动噪声仿真技术,以圆柱绕流气动噪声仿真为例
附赠仿真学习包,包含结构.流体.电磁.热仿真等多学科视频教程,点击领取: 仿真秀粉丝专属礼包 作者:小禹治水,仿真秀科普作者 一.写在前面 Actran是fft(Free Field Te ...
- Kubernetes 固定 Pod IP 地址方法
第七章 Kubernetes 固定 Pod IP 地址方法 文章目录 第七章 Kubernetes 固定 Pod IP 地址方法 一.自定义 IP 地址池 1.下载 calico 管理工具 calic ...
- python做圆柱绕流_基于snappyHexMesh生成网格的圆柱绕流算例
基于snappyHexMesh生成网格的圆柱绕流算例 1.创建几何体STL文件 在了解了原理之后,要生成网格第一步就是要创建一个几何体的STL文件,可以使用3Dbulider,3DCAD等软件生成几何 ...
- OpenFOAM的圆柱绕流算例记录
圆柱绕流是流体力学里最经典的算例之一,受到众多学者的"喜爱".初学CFD的人除了空腔.管道流之外,最先接触的莫过于圆柱绕流了.圆柱绕流能反映流体流过障碍物时的各种情况:层流向湍流的 ...
- Python-LBM(格子玻尔兹曼)程序源码实例分析—圆柱绕流篇
初次学习LBM计算方法,找到一个比较优秀的用python语言编写的圆柱绕流的实例,对每段代码详细添加了注释,帮助自己总结,也为初学的朋友们提供一点帮助(全部代码在文章最后). 先放一张结果图像: 1. ...
最新文章
- Nature封面:每天工作21.5小时的AI化学家,8天内完成688个实验,已自主发现一种全新催化剂...
- 【手写系列】写出我的第一个框架:迷你版Spring MVC
- 广东省计算机大赛设计什么时候,2017年广东省大学生计算机设计大赛
- linux中/bin和/sbin和/usr/bin和/usr/sbin
- JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
- parallelstream启动的线程数_高并发与多线程网络学习笔记(三)线程组和线程池
- 什么标签用于在表单中构建复选框_基础表单标签及属性
- Django auth认证
- 什么是黑盒测试,和白盒测试的区别有哪些?
- GUID转换字符串的几种形式
- 谷歌浏览器flash插件离线下载,最新版
- Windows11如何使用安卓子系统的Amazon Appstore
- JavaScript ES6新特性
- WMB Commands
- linux设置双屏拼接_Linux下双屏显示设置
- echarts加载世界地图并展示个人数据
- java实现wife链接硬件_【技术分享】在Android 910上面实现WIFI功能
- 自称菜鸟的二本大龄程序员居然拿到百度offer,还有嘉实offer(百度三面面经)
- 测试吃鸡游戏帧数软件,高频内存吃鸡、CSGO帧数提高多少?这一测试告诉你
- 为什么有的测试员路越走越窄?原因在这里
热门文章
- 《概率论与数理统计》(浙大第四版)第三章总结笔记(纯手写)
- jflash添加芯片_【原创】巧用J-Link+J-Flash给Kinesis烧写序列号
- 80端口被占用的两种解决方案 - 超详细(已解决)
- BSText - YY大神的富文本框架 YYText 的 Swift 版本
- 视觉SLAM十四讲 安装OpenCV
- web前端三大主流框架
- 使用Tesseract对图片文字OCR识别
- 线性代数学习之行列式
- 小米php架构图,小米商城基本框架部分
- /usr/bin/ld: cannot find Scrt1.o: No such file or directory