目录
- 一、问题描述
- 二、利用概念神经网络实现柴油机故障诊断原理
- 三、算法步骤
- 3.1 定义样本
- 3.2 样本归一化
- 3.3 创建网络模型
- 3.4 测试
- 3.5 显示结果
- 四、运行结果
- 五、完整代码
一、问题描述
柴油机的结构较为复杂,工作状况非常恶劣,因此发生故障的可能性较大。本例采用概率神经网络建立分类模型,采集柴油机振动信号作为输入,成功实现了故障有无的判断和故障类型的判断。
柴油机故障诊断可以抽象对一种分类问题,有无故障的判断,是一种二分类问题,而具体故障类型的判断,为多类分类问题。正确判断的关键在于选择合适的特征来描述柴油机的工作状况,以及选用合适的分类器将不同类别的样本分开。
二、利用概念神经网络实现柴油机故障诊断原理
- 特征选择。柴油机运行时包含丰富的特征信息,可以选择气压、油压、热力性能参数、振动参数等。本例采用振动时域信号作为特征信号。
- 分类器设计。这里采用概率神经网络来完成。
定义柴油机的五种故障类型:
类型 | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
分类模式 | 第一缸喷油压力过大 | 第一缸喷油压力过小 | 第一缸喷油器针阀磨损 | 油路堵塞 | 供油提前角提前 | 正常状态 |
采集柴油机正常运转和5种故障模式下的振动信号,再对振动波形做统计学处理,得到能量参数、峰度参数、波形参数、裕度参数、脉冲参数和峰值参数,形成一个6维向量:
x
=
[
x
1
,
x
2
,
x
3
,
x
4
,
x
5
,
x
6
]
{\bf{x}} = \left[ {{x_1},{x_2},{x_3},{x_4},{x_5},{x_6}} \right]
x=[x1,x2,x3,x4,x5,x6]
收集2份每种分类模式的样本,共计12份训练样本,详细样本见3.1节。
用于柴油机故障诊断的概率神经网络模型包含12份输入样本,每个样本为6维向量,分类模式为6种,建立的概率神经网络结构如下:
算法流程图如下:
三、算法步骤
3.1 定义样本
每列为一个样本,训练样本为612矩阵,测试样本为66矩阵:
%% 定义训练样本和测试样本
% 故障1
pro1 = [1.97,9.5332,1.534,16.7413,12.741,8.3052;
1.234,9.8209,1.531,18.3907,13.988,9.1336]';
% 故障2
pro2 = [0.7682,9.5489,1.497,14.7612,11.497,7.68;
0.7053,9.5317,1.508,14.3161,11.094,7.3552]';
% 故障3
pro3 = [0.8116,8.1302,1.482,14.3171,11.1105,7.4967;
0.816,9.0388,1.497,15.0079,11.6242,7.7604]';
% 故障4
pro4 = [1.4311,8.9071,1.521,15.746,12.0088,7.8909;
1.4136,8.6747,1.53,15.3114,11.6297,7.5984]';
% 故障5
pro5 = [1.167,8.3504,1.51,12.8119,9.8258,6.506;
1.3392,9.0865,1.493,15.0798,11.6764,7.8209]';
% 正常运转
normal = [1.1803,10.4502,1.513,20.0887,15.465,10.2193;
1.2016,12.4476,1.555,20.6162,15.755,10.1285]';
% 训练样本
trainx = [pro1, pro2, pro3, pro4, pro5, normal];
% 训练样本的标签
trlab = 1:6;
trlab = repmat(trlab, 2, 1);
trlab = trlab(:)';
3.2 样本归一化
使用mapminmax函数完成训练样本的归一化:
[x0,s] = mapminmax(trainx);
3.3 创建网络模型
newpnn函数唯一的可调参数为平滑因子spread,在这里将其设置为1:
spread = 1;
net = newpnn(x0, ind2vec(trlab), spread);
3.4 测试
首先需要定义测试样本及其正确分类模式标签,然后将测试样本按与训练样本相同的方式进行归一化,最后将其输入到上一步创建的网络模型中:
% 测试样本
testx = [0.7854,8.7568,1.4915,14.4547,11.1971,7.5071;
1.1833,11.8189,1.5481,20.2626,15.5814,10.0646;
0.661,8.8735,1.508,13.598,10.5171,6.9744;
1.3111,7.9501,1.4915,14.9174,10.7511,7.7127;
1.2394,9.6018,1.5366,18.219,13.851,9.0142;
1.2448,8.3654,1.5413,15.2558,11.5643,7.503]';
% 测试样本标签(正确类别)
testlab = [3,6,2,5,1,4];
% 测试样本归一化
xx = mapminmax('apply',testx, s);
% 将测试样本输入模型
s = sim(net,xx);
% 将向量形式的分类结果表示为标量
res = vec2ind(s);
3.5 显示结果
显示6个测试样本的诊断结果,这6个样本分别属于一种分类模式:
strr = cell(1,6);
for i=1:6
if res(i) == testlab(i)
strr{i} = '正确';
else
strr{i} = '错误';
end
end
diagnose_ = {'第一缸喷油压力过大','第一缸喷油压力过小', '第一缸喷油器针阀磨损',...
'油路堵塞', '供油提前角提前 ','正常'};
fprintf('诊断结果:\n');
fprintf(' 样本序号 实际类别 判断类别 正/误 故障类型 \n');
for i =1:6
fprintf(' %d %d %d %s %s\n',...
i, testlab(i), res(i), strr{i}, diagnose_{res(i)});
end
四、运行结果
运行结果如下:
五、完整代码
完整代码如下:
%% 清空工作空间
clear,clc
close all
%% 定义训练样本和测试样本
% 故障1
pro1 = [1.97,9.5332,1.534,16.7413,12.741,8.3052;
1.234,9.8209,1.531,18.3907,13.988,9.1336]';
% 故障2
pro2 = [0.7682,9.5489,1.497,14.7612,11.497,7.68;
0.7053,9.5317,1.508,14.3161,11.094,7.3552]';
% 故障3
pro3 = [0.8116,8.1302,1.482,14.3171,11.1105,7.4967;
0.816,9.0388,1.497,15.0079,11.6242,7.7604]';
% 故障4
pro4 = [1.4311,8.9071,1.521,15.746,12.0088,7.8909;
1.4136,8.6747,1.53,15.3114,11.6297,7.5984]';
% 故障5
pro5 = [1.167,8.3504,1.51,12.8119,9.8258,6.506;
1.3392,9.0865,1.493,15.0798,11.6764,7.8209]';
% 正常运转
normal = [1.1803,10.4502,1.513,20.0887,15.465,10.2193;
1.2016,12.4476,1.555,20.6162,15.755,10.1285]';
% 训练样本
trainx = [pro1, pro2, pro3, pro4, pro5, normal];
% 训练样本的标签
trlab = 1:6;
trlab = repmat(trlab, 2, 1);
trlab = trlab(:)';
%% 样本的归一化,s为归一化设置
[x0,s] = mapminmax(trainx);
%% 创建概率神经网络
tic;
spread = 1;
net = newpnn(x0, ind2vec(trlab), spread);
toc
%% 测试
% 测试样本
testx = [0.7854,8.7568,1.4915,14.4547,11.1971,7.5071;
1.1833,11.8189,1.5481,20.2626,15.5814,10.0646;
0.661,8.8735,1.508,13.598,10.5171,6.9744;
1.3111,7.9501,1.4915,14.9174,10.7511,7.7127;
1.2394,9.6018,1.5366,18.219,13.851,9.0142;
1.2448,8.3654,1.5413,15.2558,11.5643,7.503]';
% 测试样本标签(正确类别)
testlab = [3,6,2,5,1,4];
% 测试样本归一化
xx = mapminmax('apply',testx, s);
% 将测试样本输入模型
s = sim(net,xx);
% 将向量形式的分类结果表示为标量
res = vec2ind(s);
%% 显示结果
strr = cell(1,6);
for i=1:6
if res(i) == testlab(i)
strr{i} = '正确';
else
strr{i} = '错误';
end
end
diagnose_ = {'第一缸喷油压力过大','第一缸喷油压力过小', '第一缸喷油器针阀磨损',...
'油路堵塞', '供油提前角提前 ','正常'};
fprintf('诊断结果:\n');
fprintf(' 样本序号 实际类别 判断类别 正/误 故障类型 \n');
for i =1:6
fprintf(' %d %d %d %s %s\n',...
i, testlab(i), res(i), strr{i}, diagnose_{res(i)});
end