%这是一个动态模态分解matlab程序,X和Y已知,对此数据进行分析,我想将随时间衰减很快,且振幅(能量)大的模态都减掉,应该怎么写程序?
(实在不好意思 修改了一下题目)
[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;
% %对信号初始振幅排序,速度快,输出能量可以近似用振幅平方代替
%[b,Ie] = sort(abs(b),'descend');
%Energy = abs(b).*abs(b);
%求出所有模态的信号,并计算能量。这是按照能量排序,和上面3行不一样。毕竟DMD模态的排序方法不唯一。
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