【数据分析】基于Koopman理论与谱模型降阶思想的多种湍流自然流动与工程流动的随机数据驱动降阶模型附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
湍流是自然界和工程领域中普遍存在的复杂流动现象,对其进行准确模拟和分析对于理解物理过程、优化工程设计至关重要。然而,直接数值模拟(DNS)湍流需要巨大的计算资源,在实际应用中往往难以实现。因此,发展高效的降阶模型成为湍流研究的重要方向。基于 Koopman 理论与谱模型降阶思想的数据驱动降阶模型,为解决这一难题提供了新的途径。
二、Koopman 理论基础
(一)Koopman 算子定义
(二)Koopman 模态分析
构建观测函数:选择合适的观测函数 φ(x),例如速度分量、涡量等物理量的函数。通过对观测函数在不同时刻系统状态上的取值,构建 Koopman 矩阵的近似表示。
特征值与特征函数计算:利用数据驱动的方法,如 Dynamic Mode Decomposition(DMD),计算 Koopman 算子的近似特征值和特征函数。DMD 通过对数据矩阵进行奇异值分解等操作,快速估计 Koopman 模态。这些模态反映了湍流流动中的各种动态模式,如大尺度涡旋结构的演化、小尺度耗散过程等。
(三)谱降阶与模型构建
结合谱降阶方法:将 Koopman 模态分析与谱降阶思想相结合,利用 POD 等方法对 Koopman 模态进行进一步筛选和降维。POD 可以帮助我们找到对系统能量贡献最大的 Koopman 模态组合,去除那些对系统动态影响较小的模态,从而构建更加精简的降阶模型。
降阶模型推导:基于保留的 Koopman 模态,推导降阶模型的动力学方程。通过将原始湍流系统的动力学投影到由这些模态张成的低维空间,得到关于投影系数 z(t) 的常微分方程组。这些方程描述了降阶模型在低维空间中的演化,能够以较小的计算成本近似模拟原始湍流系统的主要动态特性。
⛳️ 运行结果
📣 部分代码
function [T,G,Y_0] = SLICK(A, dt, nt_train, gamma1, gamma2, t_remove, shift, varargin )
%% Stochastic Low-dimensional Inflated Convolutional Koopman model (SLICK)
% Inputs:
%
% A: Convolutional expansion coeffcients obtained from tcoeffs(...)
% dt: Time step
% nt_train: Size of the training set
% gamma 1&2: Ridge parameters for L2 regularization
% t_remove: Removal of the first few snapshots; not necessary
% shift: Starting point of the training set
% Outputs:
%
% T: State transition matrix
% G: De-whitening filter
% Y_0: All the inflated state vectors
% Reference:
% [1] T. Chu, O. T. Schmidt, Stochastic reduced-order Koopman model
% for turbulent flows. (Under preparation)
% [2] T. Chu, O. T. Schmidt, A stochastic SPOD-Galerkin model for
% broadband turbulent flows. Theoretical and Computational Fluid
% Dynamics 35, no. 6 (2021): 759-782.
% T. Chu (tchu72@gatech.edu), O. T. Schmidt (oschmidt@ucsd.edu)
% Last revision: 16-Sept-2024 Tianyi Chu <tchu72@gatech.edu>
%%
Nf = size(A,1);
M_n = size(A,2);
nt = size(A,3);
if nargin == 8
data_type = varargin{1};
else
data_type = 'real';
end
if strcmpi(data_type,'real')
nDFT = (Nf-1)*2;
elseif strcmpi(data_type,'complex')
nDFT = Nf;
end
%% Koopman approach for convolutional coordinates, Eqns(2.24-2.25)
X = reshape( permute(A(:,:,(1:nt_train-nDFT-1)+nDFT/2),[2 1 3]),[],nt_train-nDFT-1);
Y = reshape( permute(A(:,:,(2:nt_train-nDFT)+nDFT/2),[2 1 3]),[],nt_train-nDFT-1);
K_0 = Y*(X'/(X*X'+gamma1*speye((Nf)*M_n)) ) ;
K1 = (K_0-eye(length(K_0)))/dt;
%% temporal derivatives
B = zeros(M_n*(Nf),nt);
dbdt = zeros(M_n*(Nf),nt);
dadt = zeros(M_n*(Nf),nt);
A_1 = reshape(permute(A,[2 1 3]),[],size(A,3));
for it=1:nt
disp(['computing B from data at time step ' num2str(it) '/' num2str(nt)])
if it<nt-1
dadt(:,it) = (A_1(:,it+1)-A_1(:,it))/(dt);
B(:,it) = (A_1(:,it+1)-A_1(:,it))/(dt)-K1*A_1(:,it);
dbdt(:,it) = (A_1(:,it+2)+A_1(:,it)-2*A_1(:,it+1))/(dt^2)-K1*(A_1(:,it+1)-A_1(:,it))/(dt);
elseif it==nt
dadt(:,it) = (3*A_1(:,nt)+A_1(:,nt-2)-4*A_1(:,nt-1))/(2*dt);
B(:,it) = (3*A_1(:,nt)+A_1(:,nt-2)-4*A_1(:,nt-1))/(2*dt)-K1*A_1(:,nt);
dbdt(:,it) = (-A_1(:,it)-A_1(:,it-2)+2*A_1(:,it-1))/(dt^2)-K1*(3*A_1(:,nt)+A_1(:,nt-2)-4*A_1(:,nt-1))/(2*dt);
end
end
%% Inflated Koopman approach. Eqns(3.1-3.4)
