文章标题

MSET的MATLAB实现

具体流程如下所示:分别导入历史状态集合和观测状态集合——数据归一化——求出预测值——作图,画出各个变量的观测值和预测值——用欧氏距离表达他们的距离——滑动窗口统计法求相似度曲线和监测线。

clear
clc
[a1]=xlsread('shuju','F3:F1322');%发电功率
[b1]=xlsread('shuju','I3:I1322');%2号引风机入口烟气压力
[c1]=xlsread('shuju','O3:O1322');%2号引风机轴承1振动
[d1]=xlsread('shuju','L3:L1322');%2号引风机轴承1温度
NUM=length(a1);
%归一化处理
a=zeros(1,NUM);
b=zeros(1,NUM);
c=zeros(1,NUM);
d=zeros(1,NUM);
a1=a1';
b1=b1';
c1=c1';
d1=d1';
for m=1:NUM
    a(1,m)=(a1(1,m)-min(a1))/(max(a1)-min(a1));
    b(1,m)=(b1(1,m)-min(b1))/(max(b1)-min(b1));
    c(1,m)=(c1(1,m)-min(c1))/(max(c1)-min(c1));
    d(1,m)=(d1(1,m)-min(d1))/(max(d1)-min(d1));
end
D=[a;b;c;d]; %归一化后历史向量集合
D_=[a1;b1;c1;d1];%真实的历史向量集合
[x]=xlsread('shuju','F1331:F1470');
[y]=xlsread('shuju','I1331:I1470');
[z]=xlsread('shuju','O1331:O1470');
[p]=xlsread('shuju','L1331:L1470');
num=length(x);
%将读取的数据倒置
x=x';
y=y';
z=z';
p=p';
%归一化处理
x1=zeros(1,num);
y1=zeros(1,num);
z1=zeros(1,num);
p1=zeros(1,num);
for m=1:num
    x1(1,m)=(x(1,m)-min(x))/(max(x)-min(x));
    y1(1,m)=(y(1,m)-min(y))/(max(y)-min(y));
    z1(1,m)=(z(1,m)-min(z))/(max(z)-min(z));
    p1(1,m)=(p(1,m)-min(p))/(max(p)-min(p));
end
Kobs=[x1;y1;z1;p1];%归一化后的观测值
Kobs_=[x;y;z;p];%真实的观测值
%MEST模型
Temp=zeros(NUM);
for i=1:NUM
    for j=1:NUM
         Temp(i,j)=norm(D_(:,i)-D_(:,j),2); 
    end
end
Temp1=ones(NUM,num);
for ii=1:NUM
    for jj=1:num
         Temp1(ii,jj)=norm(D_(:,ii)-Kobs_(:,jj),2); 
    end
end
Kest_=D_*inv(Temp)*Temp1;%真实的预测值
%预测值归一化
Kest=zeros(4,num);
 for k=1:num
    Kest(1,k)=(Kest_(1,k)-min(Kest_(1,:)))/(max(Kest_(1,:))-min(Kest_(1,:)));
    Kest(2,k)=(Kest_(2,k)-min(Kest_(2,:)))/(max(Kest_(2,:))-min(Kest_(2,:)));
    Kest(3,k)=(Kest_(3,k)-min(Kest_(3,:)))/(max(Kest_(3,:))-min(Kest_(3,:)));
    Kest(4,k)=(Kest_(4,k)-min(Kest_(4,:)))/(max(Kest_(4,:))-min(Kest_(4,:)));
 end
err=Kobs_-Kest_;
xerror=err(1,:);
yerror=err(2,:);
zerror=err(3,:);
perror=err(4,:);
%画图:
outputpict(Kest_,Kobs_,xerror,yerror,zerror,perror);

%求相似度曲线--欧氏距离
sim=zeros(1,num);
for i=1:num
    sim(1,i)=1-norm(Kobs(:,i)-Kest(:,i),2)/0.75;
end
% figure(5)
% plot(sim,'LineWidth',2);
%求相似度检测线--滑动窗口统计法
N=30;%N为窗口宽度
sim_js=zeros(1,num+1-N);
sim_jssum=zeros(1,num+1-N);
for i=1:num+1-N
    for j=0:N-1
        sim_jssum(1,i)=sim_jssum(1,i)+sim(i+j);
    end
    sim_js(1,i)=sim_jssum(1,i)/N;
end
sim_jsmin=min(sim_js);
sen=0.98;%sen为预警的灵敏性
figure(6)
plot(sim_js,'LineWidth',2);
hold on
plot([0,num],[0.66869,0.66869],'r','LineWidth',2);%从健康数据验证得到检测线为0.66869

数据用的是引风机的数据,监测线由健康数据求出,通过模拟温度的故障可以检验模型是否能发出预警。其中作图的函数如下:

function outputpict(Kest_,Kobs_,xerror,yerror,zerror,perror)
figure(1)
subplot(2,1,1)
plot(Kest_(1,:),'k','LineWidth',1.5);
hold on
plot(Kobs_(1,:),'--*r','LineWidth',1.2);
title('发电功率的预测值与观测值的比较');
grid on;
subplot(2,1,2)
plot(xerror,'LineWidth',1.5);
title('发电功率的预测值与观测值之间的误差');
grid on;
%输出y
figure(2)
subplot(2,1,1)
plot(Kest_(2,:),'k','LineWidth',1.5);
hold on
plot(Kobs_(2,:),'--*b','LineWidth',1.2);
title('入口烟气压力的预测值与观测值的比较');
grid on;
subplot(2,1,2)
plot(yerror,'LineWidth',1.5);
grid on;
title('入口烟气压力的预测值与观测值之间的误差');
%输出z
figure(3)
subplot(2,1,1)
plot(Kest_(3,:),'k','LineWidth',1.5);
hold on
plot(Kobs_(3,:),'--*g','LineWidth',1.2);
title('引风机轴承1水平振动的预测值与观测值的比较');
grid on;
subplot(2,1,2)
plot(zerror,'LineWidth',1.5);
title('引风机轴承1水平振动的预测值与观测值之间的误差');
grid on;
%输出p
figure(4)
subplot(2,1,1)
plot(Kest_(4,:),'k','LineWidth',1.5);
hold on
plot(Kobs_(4,:),'--*m','LineWidth',1.2);
title('引风机轴承1温度的预测值与观测值的比较');
grid on;
subplot(2,1,2)
plot(perror,'LineWidth',1.5);
title('引风机轴承1温度的预测值与观测值之间的误差');
grid on;
end

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值