目录
1 简介
2 变分模态分解VMD原理
3 GA优化VMD效果
3.1 遗传算法优化VMD各分量信号图像
3.2 全部图像
4 主要代码
main.m
GA_VMD.m
针对从滚动轴承振动信号中所提取的故障信息精度低的问题,利用遗传算法对变分模态分解模态个数K和惩罚参数α 寻优,目标函数为多尺度排列熵参数,再根据VMD处理信号得到若干模态分量,筛选后进一步提取能量熵作为特征向量。使用特征提取向量,可进行后续轴承故障诊断等工作。
VMD能够自适应匹配每种模态的最佳中心频率和有限带宽,实现固有模态分量(IMF)有效分离,
其核心思想是构建和求解变分问题。
VMD实现步骤为:
由VMD分解步骤可知,分解信号前需要设置合适的模态个数K和惩罚参数α,K取值过大会导致过分解,反之,则会欠分解,α 取值过大,会造成频带信息丢失,反之,会信息冗余,所以需要确定最佳参数组合[K,α]。目前多用中心频率观察法,通过观察不同K值下的中心频率确定K值,但该法具有偶然性,且只能确定模态个数K,无法确定惩罚参数α。
使用遗传算法(GA)对VMD变分模态分解的惩罚参数alpha与分解模态层数K进行寻优,以局部包络熵极小值作为适应度函数。[alpha, K] 为进化个体的位置,局部包络熵极小值为个体的适应度值。
1.时域图像
2.频谱图像
%% 基于遗传算法(genetic algorithm, GA))优化变分模态分解(variational mode decomposition,VMD)参数
clc
clear
close all
% 读取数据
[file,path,indx] = uigetfile({'*.xlsx';'*.xls';'*.txt';'*.*'},'File Selector');
if indx == 1||indx==2
data=xlsread(strcat(path, file));
elseif indx == 3
data=load(strcat(path, file));
else
warning('请选择数据集进行实验');
return;
end
%采样频率
fs=12800;
% 读取前1000长度的信号
len=1000;
s=data(1:len);
% 采样时间
t = (0:len-1)/fs;
%% 设定遗传算法参数
popsize =6; % 种群大小
iter =30; % 最大迭代次数
dim = 2; % 变量个数
lb = [100 3]; % alpha范围 K范围 下限
ub = [2000 7]; % 上限
pc=0.8; %交叉概率,0和1之间
pm=0.2; %变异概率,0和1之间
%% 遗传算法GA优化VMD参数
tic , % 开始计时
GA_VMD(popsize,iter,dim,lb,ub,pc,pm,0); % 0表示不保存IMF,1,导出IMF并保存
toc, % 结束计时
% 初始化GA的参数信息
lenchrom=ones(1,dim); %每个变量的字串长度,如果是浮点变量,则长度都为1
lb=lb.*ones(1,dim);
ub=ub.*ones(1,dim);
bound=[lb;ub]';
% 初始化个体数组
individuals=struct('fitness',zeros(1,SearchAgents_no), 'chrom',[]); %将种群信息定义为一个结构体
avgfitness=[]; %每一代种群的平均适应度
%% 初始化种群计算适应度值
% 初始化种群
for i=1:SearchAgents_no
%随机产生一个种群
individuals.chrom(i,:)=Code(lenchrom,bound);
x=individuals.chrom(i,:);
%计算适应度
individuals.fitness(i)=fun(x,s); %染色体的适应度
end
%找最好的染色体
[bestfitness, bestindex]=min(individuals.fitness);
bestchrom=individuals.chrom(bestindex,:); %最好的染色体
avgfitness=sum(individuals.fitness)/SearchAgents_no; %染色体的平均适应度
% 记录每一代进化中最好的适应度
Convergence_curve=zeros(Max_iteration,1);
gbest_array=zeros(Max_iteration,2);
%% 迭代寻优
for i=1:Max_iteration
disp(['current iteration is: ',num2str(i), ', best fitness is: ', num2str(bestfitness)])
% 选择
individuals=select(individuals,SearchAgents_no);
avgfitness=sum(individuals.fitness)/SearchAgents_no;
%交叉
individuals.chrom=Cross(pc,lenchrom,individuals.chrom,SearchAgents_no,bound);
% 变异
individuals.chrom=Mutation(pm,lenchrom,individuals.chrom,SearchAgents_no,[i Max_iteration],bound);
% 计算适应度
for j=1:SearchAgents_no
x=individuals.chrom(j,:); %解码
individuals.fitness(j)=fun(x,s);
end
%找到最小和最大适应度的染色体及它们在种群中的位置
[newbestfitness,newbestindex]=min(individuals.fitness);
[~,worestindex]=max(individuals.fitness);
% 代替上一次进化中最好的染色体
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=individuals.chrom(newbestindex,:);
end
individuals.chrom(worestindex,:)=bestchrom;
individuals.fitness(worestindex)=bestfitness;
avgfitness=sum(individuals.fitness)/SearchAgents_no;
Convergence_curve(i,1)=bestfitness; %记录每一代进化中最好的适应度和平均适应度
gbest_array(i,:)=bestchrom;
end
%进化结束
代码地址为:
MATLAB代码地址https://mianbaoduo.com/o/bread/YZ2ck5xqhttps://mianbaoduo.com/o/bread/YZ2ck5xq