tudoumama2018 2023-06-05 22:56 采纳率: 46.7%
浏览 71
已结题

matlab动态模态分解程序

%这是一个动态模态分解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

  • 写回答

9条回答 默认 最新

  • 全栈若城 全栈领域优质创作者 2023-06-05 23:15
    关注
    获得1.80元问题酬金

    这是一个组合函数吧 , 你少给我东西了吧?

    评论

报告相同问题?

问题事件

  • 系统已结题 6月13日
  • 赞助了问题酬金15元 6月7日
  • 修改了问题 6月7日
  • 创建了问题 6月5日

悬赏问题

  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥20 Python安装cvxpy库出问题
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题