matlab实现动态模态分解程序

这是一个动态模态分解matlab程序,X和Y已知,对此数据进行分析,我想将随时间衰减很快,且振幅(能量)大的模态都减掉,应该怎么写程序?条件1:模态随时间衰减很快的模态。2:同时振幅(能量)大的模态 。想把同时满足这两个条件的模态减掉,怎么办?
谢谢!麻烦了!

[Dd,b,Phi,Time_DMD,Energy] = DMD_CLASS(X,Y);
function [Dd,b,Phi,Time_DMD,Energy] = DMD_CLASS(X,Y)
%DMD分解函数
%输入:
%X,Y,DMD分解的数据矩阵。X是data(1,1:(end-1)),Y是data(:,2:end)。
%
%输出:
%Dd,特征根
%b,初始状态
%Phi,DMD分解的模态
%Time_DMD,DMD还原信号所用到的时间项
%Energy,每个模态对应的能量,从大到小排序
 
N=size(X,2);
%1 SVD分解
[U,S,V] = svd(X,'econ');%奇异值分解的精简分解
%删除奇异值约等于0的模态,防止计算发散
Sd = diag(S);
r = sum(Sd>1e-4);%可以将条件改成1e-6,1e-5等
U = U(:,1:r);
S = S(1:r,1:r);
V = V(:,1:r);
%2 求解矩阵A
A = U'*(Y*V/S);
%3 求矩阵A的特征值和特征向量
[Om,D] = eig(A);
Dd = diag(D);%求特征值转为向量形式
%4 求DMD模态
Phi = Y*V/S*Om;
%5 求解初始状态b
b = Phi\X(:,1);
%6 对模态进行排序
Q = Dd.^(0:N-1);%计算出范德蒙矩阵
Time_DMD = b.*Q;%旧版本matlab可以用右边形式替换Time_DMD=(b*ones(1,N)).*Q;

%求出所有模态的信号,并计算能量。这是按照能量排序。
Energy = zeros( size(Phi,2) , 1 );
for k = 1 : size(Phi,2)
Uxt_DMD_k = real(Phi(:,k) * Time_DMD(k,:));
E_k = sum( sum( Uxt_DMD_k.^2 ) );
Energy(k) = E_k;
end
[Energy,Ie] = sort(Energy,'descend');%对每个模态的能量进行排序
 
%按顺序输出特征值、初始状态b、模态Phi
Dd = Dd(Ie);
b = b(Ie);
Phi = Phi(:,Ie);
Time_DMD = Time_DMD(Ie,:);
end
 



% 2023年6月8日14:17:45    加了两组测试数据矩阵 运行完成
data = [1 2 3 4 5 6 7 8 9];   %例如一个9列数据矩阵
X = data(1,1:end-1);         %X为第一行,第1至第8列
Y = data(:,2:end);           %Y为全部行,第2至第9列
function [Dd,b,Phi,Time_DMD,Energy] = DMD_CLASS(X,Y)  
%DMD分解函数  
%输入:  
%X,Y,DMD分解的数据矩阵。X是data(1,1:(end-1)),Y是data(:,2:end)。  
%  
%输出:  
%Dd,特征根 
%b,初始状态  
%Phi,DMD分解的模态  
%Time_DMD,DMD还原信号所用到的时间项  
%Energy,每个模态对应的能量,从大到小排序  


N=size(X,2);  
%1 SVD分解  
[U,S,V] = svd(X,'econ');%奇异值分解的精简分解  
%删除奇异值约等于0的模态,防止计算发散  
Sd = diag(S);  
r = sum(Sd>1e-4);%可以将条件改成1e-6,1e-5等  
U = U(:,1:r);  
S = S(1:r,1:r);  
V = V(:,1:r);  
%2 求解矩阵A  
A = U'*(Y*V/S);  
%3 求矩阵A的特征值和特征向量  
[Om,D] = eig(A);  
Dd = diag(D);%求特征值转为向量形式  
%4 求DMD模态  
Phi = Y*V/S*Om;  
%5 求解初始状态b  
b = Phi\X(:,1);  
%6 对模态进行排序  
Q = Dd.^(0:N-1);%计算出范德蒙矩阵  
Time_DMD = b.*Q;%旧版本matlab可以用右边形式替换Time_DMD=(b*ones(1,N)).*Q;  

%求出所有模态的信号,并计算能量。这是按照能量排序。  
Energy = zeros( size(Phi,2) , 1 );  
for k = 1 : size(Phi,2)  
Uxt_DMD_k = real(Phi(:,k) * Time_DMD(k,:));   
E_k = sum( sum( Uxt_DMD_k.^2 ) );  
Energy(k) = E_k;  
end  
[Energy,Ie] = sort(Energy,'descend');%对每个模态的能量进行排序  

delta = 1; % 采样间隔,此处设置为1
% 计算每个模态的衰减率  
decay_rate = abs(log(Dd)/delta);   

% 找出衰减率较大的模态索引  
threshold = 0.5;   
fast_decay_idx = decay_rate > threshold;    

% 找出能量较大的模态索引  
energy_threshold = 1e3;    
high_energy_idx = Energy > energy_threshold;

% 同时满足两个条件的模态索引  
idx = fast_decay_idx & high_energy_idx;   

% 删除相应模态   
Dd(idx) = [];  
Phi(:,idx) = [];   
Time_DMD(idx,:) = [];  
Energy(idx) = [];

%按顺序输出特征值、初始状态b、模态Phi  
Dd = Dd(Ie);  
b = b(Ie);  
Phi = Phi(:,Ie);  
Time_DMD = Time_DMD(Ie,:);
end


我不确定这个问题的确切表述,但是根据参考资料,可以通过实现动态模态分解程序和根据振幅和衰减率删除模态来满足条件。可以使用DMD、EMD、CEEMDAN等方法实现动态模态分解,进而对模态进行处理来删除振幅很大且衰减很快的模态。以下是用MATLAB实现DMD的示例代码:

% 假设数据存储在矩阵A中,每一列代表一个时间步骤
[U, S, V] = svd(A, 'econ'); % 对矩阵进行SVD分解,得到左奇异向量矩阵U、特征值对角矩阵S和右奇异向量矩阵V
r = rank(A); % 计算矩阵A的秩
Ur = U(:, 1:r); % 取出U的前r列
Sr = S(1:r, 1:r); % 取出S的前r行和前r列,得到秩为r的对角矩阵
Vr = V(:, 1:r); % 取出V的前r列
Atilde = Ur'*A*Vr/Sr; % 按照DMD算法的要求,对A进行变换
[W, D] = eig(Atilde); % 对变换后的矩阵Atilde进行特征值分解,得到特征向量矩阵W和特征值矩阵D
Phi = A*Vr/Sr*W; % 按照DMD算法的要求,计算原始模态矩阵Phi
lambda = diag(D); % 取出特征值对角矩阵的对角线元素,得到特征值向量lambda
omega = log(lambda)/(dt); % 计算特征值向量lambda的对数,得到频率向量omega
y0 = Phi\A(:,1); % 按照DMD算法的要求,计算初始条件向量y0
% 根据得到的频率向量omega和初始条件向量y0,用动态模态分解生成时间序列
time_dynamics = zeros(r,length(t)); 
for iter = 1:length(t)
    time_dynamics(:,iter) = (y0.*exp(omega*t(iter)));
end

然后,可以通过选择振幅和衰减率的阈值来删除符合条件的模态,并重新构造信号:

% 假设删除的衰减率阈值为0.1,删除的振幅阈值为0.5
lambda_thresh = 0.1; 
amp_thresh = 0.5;
% 初始化存储删除后模态的矩阵
Phi_new = zeros(size(Phi));
j = 1;
% 对Phi中每一列进行检查,如果模态满足条件,则删除该模态
for i = 1:size(Phi,2)
    if (abs(log(lambda(i)))/(dt) > lambda_thresh) && (max(abs(Phi(:,i))) > amp_thresh)
        continue; % 模态不满足条件,不删除
    else
        % 模态满足条件,删除该模态
        Phi_new(:,j) = Phi(:,i);
        j = j+1;
    end
end
Phi_new = Phi_new(:,1:j-1); % 更新删掉模态后的模态矩阵
A_dmd_new = Phi_new*time_dynamics; % 重新构造信号

注意,以上代码示例可能需要根据具体数据进行调整。

可以试试

%自己试一试DMD
clear
close all

%定义流场时间和空间信息
x=-8:0.2:8;
y=-5:0.2:5;
t=0:0.05:6;
Fs=1/(t(2)-t(1));
[X,Y,T]=meshgrid(x,y,t);
[Ny,Nx,Nt]=size(X);

%自定义流场,U是沿x方向的速度分量,V是y方向的
U0=-1*Y.^2+5;
V0=0*Y;%UV0不随时间变化,设为定常流场
U1=-5*sin(Y).*cos(2*pi*0.3*Y).*(exp(T/5));
V1=5*sin(X-1*pi*T).*cos(2*pi*0.3*Y).*(exp(T/5));
U3=0.01*rand(Ny,Nx,Nt);
V3=0.01*rand(Ny,Nx,Nt);

U_Sum=U0+U1+U3;
V_Sum=V0+V1+V3;

%1计算UV向量
U_xt=Uxyt_to_Uxt(U_Sum);%把2维问题转化为1维问题
V_xt=Uxyt_to_Uxt(V_Sum);%把2维问题转化为1维问题
%然后把UV向量合并
UV_xt=[U_xt;V_xt];
%之前的这些都属于数据准备和整理部分


%计算X和Y
UX=UV_xt(:,1:end-1);
UY=UV_xt(:,2:end);
%计算DMD
[Dd,b,Phi,Time_DMD,Energy]=DMD_CLASS(UX,UY);

%后处理
figure(1)
%图1,绘制频率和衰减图
wa=log(Dd)*Fs;
scatter(real(wa(end:-1:1)),imag(wa(end:-1:1))/2/pi,30,-log(Energy(end:-1:1)),'filled')
xlabel('衰减率');ylabel('频率')
ylim([-6,6]);xlim([-1,1])
hold on
plot([0,0],ylim,'b--')
plot(xlim,[0,0],'b--')
hold off
box on
set(gcf,'position',[488   342   400   350])

figure(2)
%图3,绘制频率-能量排序
Freq=imag(wa)/2/pi;
k=find(Freq>=0);
stem(Freq(k),log10(Energy(k)),'BaseValue',-4,'MarkerFaceColor','auto');
ylim([-4,8]);
xlim([-1,11])
set(gca,'YTickLabel',{'1e-4','1e-2','0','1e2','1e4','1e6','1e8'},'YTick',[-4:2:8])
set(gca,'XTick',[0:2:10])
xlabel('频率hz');ylabel('能量')

figure(3)
%绘制前10阶模态能量占比
Cumsum_Energy=cumsum(Energy);
subplot(2,1,1)
bar( 1:10 , Cumsum_Energy(1:10)/Cumsum_Energy(end) ,'BarWidth',1)
ylim([0,1]);
subplot(2,1,2)
plot( 1:10 , Energy(1:10)/Cumsum_Energy(end) ,'-o')
ylim([0,1]);



figure(4)
X=X(:,:,1);
Y=Y(:,:,1);

k=1;
%绘制模态
subplot(2,2,1)%总
[Uxy0,Vxy0]=UV2UxyVxy(UV_xt(:,k),Ny,Nx);
hold on
pcolor(X,Y,curl(X,Y,Uxy0,Vxy0));shading interp
quiver(X(1:5:end,1:5:end),Y(1:5:end,1:5:end),Uxy0(1:5:end,1:5:end),Vxy0(1:5:end,1:5:end),'color','k')
hold off
axis equal off
title('总')

subplot(2,2,2)%1
UVxt_DMD_k=real(Phi(:,1) * Time_DMD(1,:));
[Uxyk,Vxyk]=UV2UxyVxy(UVxt_DMD_k(:,k),Ny,Nx);
hold on
pcolor(X,Y,curl(X,Y,Uxyk,Vxyk));shading interp
quiver(X(1:5:end,1:5:end),Y(1:5:end,1:5:end),Uxyk(1:5:end,1:5:end),Vxyk(1:5:end,1:5:end),'color','k')
hold off
axis equal off
title('1阶')

subplot(2,2,3)%2
UVxt_DMD_k=real(Phi(:,2) * Time_DMD(2,:));
[Uxyk,Vxyk]=UV2UxyVxy(UVxt_DMD_k(:,k),Ny,Nx);
hold on
pcolor(X,Y,curl(X,Y,Uxyk,Vxyk));shading interp
quiver(X(1:5:end,1:5:end),Y(1:5:end,1:5:end),Uxyk(1:5:end,1:5:end),Vxyk(1:5:end,1:5:end),'color','k')
hold off
axis equal off
title('2阶')

subplot(2,2,4)%3&4
UVxt_DMD_k=real(Phi(:,3) * Time_DMD(3,:));
[Uxy3,Vxy3]=UV2UxyVxy(UVxt_DMD_k(:,k),Ny,Nx);
UVxt_DMD_k=real(Phi(:,4) * Time_DMD(4,:));
[Uxy4,Vxy4]=UV2UxyVxy(UVxt_DMD_k(:,k),Ny,Nx);
Uxyk=Uxy3+Uxy4;
Vxyk=Vxy3+Vxy4;
hold on
pcolor(X,Y,curl(X,Y,Uxyk,Vxyk));shading interp
quiver(X(1:5:end,1:5:end),Y(1:5:end,1:5:end),Uxyk(1:5:end,1:5:end),Vxyk(1:5:end,1:5:end),'color','k')
hold off
axis equal off
title('3+4阶')




function [Dd,b,Phi,Time_DMD,Energy]=DMD_CLASS(X,Y)
%DMD分解函数
%输入:
%X,Y,DMD分解的数据矩阵
%
%输出:
%Dd,特征根
%b,初始状态
%Phi,DMD分解的模态
%Time_DMD,DMD还原信号所用到的时间项
%Energy,每个模态对应的能量,从大到小排序

N=size(X,2);
%1 SVD分解
[U,S,V] = svd(X,'econ');
%删除奇异值约等于0的模态,防止计算发散
Sd=diag(S);
r=sum(Sd>1e-6);
U=U(:,1:r);
S=S(1:r,1:r);
V=V(:,1:r);
%2 求解矩阵A
A=U'*(Y*V/S);
%3 求矩阵A的特征值和特征向量
[Om,D]=eig(A);
%4 求DMD模态
Phi=Y*V/S*Om;

Dd=diag(D);%求特征值转为向量形式

%5 求解初始状态b
b=Phi\X(:,1);

Q=Dd.^(0:N-1);%计算出范德蒙矩阵
Time_DMD=b.*Q;%旧版本matlab可以用右边形式替换Time_DMD=(b*ones(1,N)).*Q;


% %对信号初始振幅排序,速度快
% [~,Ib] = sort(abs(b),'descend');
%求出所有模态的信号,并计算能量
Energy=zeros(size(Phi,2),1);
for k=1:size(Phi,2)
Uxt_DMD_k=real(Phi(:,k) * Time_DMD(k,:));
E_k=sum(sum(Uxt_DMD_k.^2));
Energy(k)=E_k;
end
[Energy,Ie] = sort(Energy,'descend');%对每个模态的能量进行排序
%按顺序输出特征值、初始状态b、模态Phi
Dd=Dd(Ie);
b=b(Ie);
Phi=Phi(:,Ie);
Time_DMD=Time_DMD(Ie,:);
end

function Uxt=Uxyt_to_Uxt(Uxyt)
%把3维矩阵的xyt压缩为xt
[Ny,Nx,Nt]=size(Uxyt);%这里是matlab的meshgrid定义导致的,x和y是反着的,注意。
Nxy=Ny*Nx;
Uxt=reshape(Uxyt,Nxy,Nt);
end

function [Uxy,Vxy]=UV2UxyVxy(UVx,Ny,Nx)
Ux=UVx(1:Ny*Nx);
Vx=UVx(Ny*Nx+1:end);
Uxy=reshape(Ux,Ny,Nx);
Vxy=reshape(Vx,Ny,Nx);
end



参考一下下面的matlab示例

% 读取数据
load('data.mat');
X = data(:, 1:end-1);
Y = data(:, 2:end);

% 进行DMD分析
[dmd_modes,dmd_evals,dmd_time_coeffs] = dmd(X,Y);

% 计算每个DMD模态的振幅
dmd_modes_amplitude = sqrt(sum(dmd_modes.^2,1)).';

% 筛选符合条件的模态
threshold_decay_rate = 1e-3; % 设置衰减率阈值
threshold_amplitude_ratio = 0.8; % 设置振幅比例阈值,这里假设是80%
dmd_modes_decay_rate = abs(log(dmd_evals));
selected_modes = find(dmd_modes_decay_rate < threshold_decay_rate);
selected_modes_amplitude = dmd_modes_amplitude(selected_modes);
max_amplitude = max(selected_modes_amplitude);
selected_modes = selected_modes(selected_modes_amplitude >= threshold_amplitude_ratio*max_amplitude);

% 去除符合条件的模态,重新计算还原数据
dmd_modes(:,selected_modes) = [];
dmd_evals(selected_modes) = [];
dmd_time_coeffs(selected_modes,:) = [];
reconstructed_data = dmd_modes*dmd_time_coeffs;

% 绘制原始数据和还原数据的对比图
figure;
subplot(2,1,1);
plot(X(:,1),X(:,2:end)); % 原始数据
xlabel('时间');
ylabel('信号');
title('原始数据');
subplot(2,1,2);
plot(real(reconstructed_data(:,1)),real(reconstructed_data(:,2:end))); % 还原数据
xlabel('时间');
ylabel('信号');
title('去掉符合条件的DMD模态后的还原数据');

首先你要通过DMD函数来计算模态,然后,对每个模态进行能量分析,可以使用模态的平均值和标准差来计算其能量。定义一个阈值,表示你要保留的模态的能量下限。假设阈值为 ϵ,则可以删除所有能量小于 ϵ 的模态。
matlab示例代码如下:


% 输入数据 X 和 Y  
% 计算 DMD 模态  
[A, B] = dmd(X, Y);  
  
% 计算每个模态的能量  
n = size(Y, 1);  
E = zeros(size(B));  
for i = 1:size(B, 2)  
    E(i) = (1/(2*n)) * (sum(B(:,i).^2) - (sum(B(:,i))'./n).^2);  
end  
  
% 删除能量小于阈值的模态  
epsilon = 0.1; % 阈值可以根据实际情况调整  
keep = (E >= epsilon);  
B = B(:, keep);  
A = A(keep, :);

参考gpt:
要实现将同时满足随时间衰减快和振幅大的模态减掉,你可以按照以下步骤修改程序:

  1. 计算模态的衰减速率:根据条件1,你可以计算每个模态的衰减速率。衰减速率可以通过计算模态中特征值的绝对值的对数来估计,即 decay_rate = abs(log(abs(Dd)))。

  2. 计算模态的振幅:根据条件2,你可以计算每个模态的振幅。振幅可以通过计算模态的能量来估计,即 amplitude = Energy。

  3. 根据衰减速率和振幅进行筛选:结合衰减速率和振幅的信息,你可以编写代码来筛选出满足条件的模态。例如,你可以设置一个阈值,只保留衰减速率小于该阈值且振幅大于该阈值的模态。
    下面是修改后的代码,其中增加了对衰减速率和振幅的筛选:

    function [Dd,b,Phi,Time_DMD,Energy] = DMD_CLASS(X,Y)
     % DMD分解函数
     % 输入:
     % X,Y,DMD分解的数据矩阵。X是data(1,1:(end-1)),Y是data(:,2:end)。
     %
     % 输出:
     % Dd,特征根
     % b,初始状态
     % Phi,DMD分解的模态
     % Time_DMD,DMD还原信号所用到的时间项
     % Energy,每个模态对应的能量,从大到小排序
    
     N = size(X,2);
     
     % 1 SVD分解
     [U,S,V] = svd(X,'econ'); % 奇异值分解的精简分解
     % 删除奇异值约等于0的模态,防止计算发散
     Sd = diag(S);
     r = sum(Sd>1e-4); % 可以将条件改成1e-6,1e-5等
     U = U(:,1:r);
     S = S(1:r,1:r);
     V = V(:,1:r);
     
     % 2 求解矩阵A
     A = U'*(Y*V/S);
     
     % 3 求矩阵A的特征值和特征向量
     [Om,D] = eig(A);
     Dd = diag(D); % 求特征值转为向量形式
     
     % 4 求DMD模态
     Phi = Y*V/S*Om;
     
     % 5 求解初始状态b
     b = Phi\X(:,1);
     
     % 6 对模态进行排序
     Q = Dd.^(0:N-1); % 计算出范德蒙矩
    

如有帮助给个采纳谢谢 !!!

思路

在原有函数中,计算每个模态的能量和特征值后,对能量从大到小进行排序,然后输出保留的模态。
在新代码中,我们首先设置 amplitude_threshold 和 energy_threshold 两个阈值,分别代表一定的幅值和能量范围,用于标识需要保留的模态。
遍历每个模态,判断是否满足删除条件。如果该模态的能量较小,则删除该模态;如果该模态的振幅(能量)较小,则将该模态的 select_index 标记为 0,表示该模态不需要保留。
当遍历到某个模态时,如果发现有另外一个模态的能量和振幅(能量)都大于该模态,且它们之间的特征值较接近,则选择保留振幅小的模态,删除振幅大的模态。
这样就能够满足你提到的这两个条件。
最后,判断每个模态的 select_index 是否为 1,将符合条件的模态对应的 Phi、Dd、b 和 Time_DMD 进行输出。

修改后代码如下

%DMD分解函数
function [Dd,b,Phi,Time_DMD,Energy] = DMD_CLASS(X,Y)
%输入:
%X,Y,DMD分解的数据矩阵。X是data(1,1:(end-1)),Y是data(:,2:end)。
%
%输出:
%Dd,特征根
%b,初始状态
%Phi,DMD分解的模态
%Time_DMD,DMD还原信号所用到的时间项
%Energy,每个模态对应的能量,从大到小排序

N = size(X,2);
%1 SVD分解
[U,S,V] = svd(X,'econ');%奇异值分解的精简分解
%删除奇异值约等于0的模态,防止计算发散
Sd = diag(S);
r = sum(Sd>1e-4);%可以将条件改成1e-6,1e-5等
U = U(:,1:r);
S = S(1:r,1:r);
V = V(:,1:r);
%2 求解矩阵A
A = U'*(Y*V/S);
%3 求矩阵A的特征值和特征向量
[Om,D] = eig(A);
Dd = diag(D);%求特征值转为向量形式
%4 求DMD模态
Phi = Y*V/S*Om;
%5 求解初始状态b
b = Phi\X(:,1);
%6 对模态进行排序
Q = Dd.^(0:N-1);%计算出范德蒙矩阵
Time_DMD = b.*Q;%旧版本matlab可以用右边形式替换Time_DMD=(b*ones(1,N)).*Q;

% 找到满足条件的模态
amplitude_threshold = 0.1; % 设置幅值的阈值
energy_threshold = 0.1; % 设置能量的阈值

select_index = ones(size(Dd));
for i = 1:length(Dd)
    % 判断模态是否需要保留
    if Energy(i) < energy_threshold % 能量较小的模态
        select_index(i) = 0;
    elseif all(abs(Phi(:,i)) < amplitude_threshold) % 振幅(能量)较小的模态
        select_index(i) = 0;
    else
        for j = i+1:length(Dd)
            % 判断是否需要删除同时振幅(能量)大的模态
            if abs(Dd(j)-Dd(i)) < 1e-10 && all(abs(Phi(:,j)-Phi(:,i))<amplitude_threshold)
                select_index(j) = 0;
            end
        end
    end
end

% 删除不符合条件的特征值所对应的 Phi 和 Dd
Phi = Phi(:, logical(select_index));
Dd = Dd(logical(select_index));

% 输出保留的模态
disp('保留的模态为:');
for i = 1:length(Dd)
    fprintf('模态 %d:\n', i);
    fprintf('特征值: %.4g\n', Dd(i));
    fprintf('Phi:\n');
    disp(Phi(:, i));
end

% 将符合条件的 Phi 和 Dd 进行输出
Energy = Energy(logical(select_index));
Dd = Dd(logical(select_index));
b = b(logical(select_index));
Time_DMD = Time_DMD(logical(select_index),:);
end


要将同时满足衰减较快和振幅(能量)较大的模态减掉,您可以按照以下步骤修改程序:

  1. 在程序中,通过对每个模态的能量进行排序,已经得到了能量从大到小排列的模态顺序。
  2. 您可以遍历模态,从能量最大的模态开始,按照条件判断是否需要减掉该模态。
  3. 对于衰减较快的模态,您可以检查特征值(Dd)的实部部分,如果它们的值较小,则表示衰减较快。您可以选择一个合适的阈值,将实部小于该阈值的模态减掉。
  4. 对于振幅较大的模态,您可以检查能量(Energy)的值,如果它们的值较大,则表示振幅较大。同样,您可以选择一个适当的阈值,将能量大于该阈值的模态减掉。
  5. 对于同时满足以上两个条件的模态,将其从模态中移除,即从特征根(Dd)、初始状态(b)、模态(Phi)和时间项(Time_DMD)中删除相应的条目。

请注意,在程序中涉及到的阈值选择可能需要根据您的具体数据和要求进行调整。