MATLAB的24脉波整流器Simulink仿真与故障诊断

news2025/4/17 3:06:23

本博客来源于CSDN机器鱼,未同意任何人转载。

更多内容,欢迎点击本专栏目录,查看更多内容。

目录

0 引言

1 故障数据采集

2 故障特征提取

3 故障诊断分类

 4 结语


本博客内容是在MATLAB2023下完成。

0 引言

对于电力电子电路的故障诊断,作为非专业的电路爱好者,搭建电路非常困难,因此常用simulink仿真来建模,如下图,是一个24脉搏整流器的仿真图。Subsystem是三相整流电路。我用的完整模型可以在【这里】下载。

1 故障数据采集

对于故障诊断数据获取,我们subsystem中的二极管断开连接,就模拟出一种故障类型。 

运行下列代码,即可完成一种类型故障数据的采集。一共4个subsystem,每个subsystem有6个二极管,各弄断路一次,一共24种故障,加上正常情况,一共需要运行下面代码25次,得到25个mat文件。记得一定要修改最后保存时候的变量。

clear;clc;close all
format compact
%
%每种故障模式均取30组样本
for i=1:30%每仿真一次就采集一次样本
    % 设置负载电阻与电感随机变动,模拟各种负载情况
    r=500*(1-0.2*rand);%负载电阻
    l=0.1*(1-0.2*rand);%负载电感
    set_param('zhengliu24/load','Resistance','r');
    set_param('zhengliu24/load','Inductance','l');

    sim('zhengliu24');
    %保存电流与电压
    current=current.signals.values;
    voltage=voltage.signals.values;
    data{i,1}=current;
    data{i,2}=voltage;
end
%% 保存结果 ,每次设置完故障类型,需要将下面这两句的变量名称改一下
%防止覆盖掉
data25=data;
save data25 data25

再运行下面的代码,将25个mat文件合并在一起,并给每个样本加上对应的标签。

clear
clc
close all
%% 直接复制,懒得写循环
load data1;
load data2;
load data3;
load data4;
load data4;
load data5;
load data6;
load data7;
load data8;
load data9;
load data10;
load data11;
load data12;
load data13;
load data14;
load data15;
load data16;
load data17;
load data18
load data19
load data20
load data21
load data22
load data23
load data24
load data25

% 要是要电压波形,把1全都改成2就行
data=[data1{:,1} data2{:,1} data3{:,1} ...
    data4{:,1} data5{:,1} data6{:,1} ...
    data7{:,1} data8{:,1} data9{:,1} ...
    data10{:,1} data11{:,1} data12{:,1} ...
    data13{:,1} data14{:,1} data15{:,1} ...
    data16{:,1} data17{:,1} data18{:,1} ...
    data19{:,1} data20{:,1} data21{:,1} ...
    data22{:,1} data23{:,1}  data24{:,1} data25{:,1} ];
data=data';
label0=1:25;
label1=repmat(label0,30,1);
label=reshape(label1,1,750);
input=data;
save data input label

%%  画图
close all
load data
% 画出正常状态与前5种故障的波形
figure
for i=1:6
    subplot(2,3,i)
    plot(input(30*(i-1)+1,:))
    axis([-inf inf 3 4.5])
    grid on
    ylabel('电流幅值/A')
    xlabel('采样点数/个')
    if i==1
        title('正常')
    elseif i==2
        title('V1故障')
    elseif i==3
        title('V2故障')
    elseif i==4
        title('V3故障')
    elseif i==5
        title('V4故障')
    elseif i==6
        title('V5故障')
    end
end

 

2 故障特征提取

采集完故障数据之后,还需要做故障特征提取,再用提取的特征做故障诊断分类器的训练与测试,代码如下,我们采用快速傅里叶提取频谱作为特征量。

% 特征提取-傅里叶频谱
%
clear
clc
close all
%% 1 加载数据
load data
%% 2 信号加噪 加入均值维0 方差为0.001的高斯白噪声
% 以模拟实际电路中的白噪声与热噪声
m=0;
n=0.001;
data=input+m+n*rand(750,800);
N=800;%采样点数
fs=20000;%采样频率
for iiii=1:750
    iiii
    S=input(iiii,:);
    %% FFT变换并计算模值
    Y = fft(S,N); %做FFT变换
    Ayy = (abs(Y)); %取模
    %% 计算幅频特征

    Ayy0=Ayy/(N/2);   %换算成实际的幅度
    Ayy0(1)=Ayy0(1)/2;
    tz(iiii,:)=Ayy0(2:N/2);%同样删除第一分量
end
input=tz;
save data_fft input label
%%
close all
load  data_fft
figure
% 画出正常状态与前5种故障的波形
for i=1:6
    subplot(2,3,i)
    bar(input(30*(i-1)+1,:))
    %     axis([-inf inf 3 4.5])
    grid on
    ylabel('电流幅值/A')
    xlabel('采样点数/个')
    if i==1
        title('正常')
    elseif i==2
        title('V1故障')
    elseif i==3
        title('V2故障')
    elseif i==4
        title('V3故障')
    elseif i==5
        title('V4故障')
    elseif i==6
        title('V5故障')
    end
end


3 故障诊断分类

最后我们采用极限学习机做故障诊断分类,分类前采用PCA做一下降维。

clc;clear;close all; format compact
%% 加载数据
load data_fft
%%
%由于特征维数过高,不利于训练网络,因此我们用PCA进行降维
[PCALoadings,PCAScores,PCAVar] = pca(input);%利用PCA进行降维
percent_explained = 100 * PCAVar / sum(PCAVar);
pareto(percent_explained)   %pareto图,只显示前95%的累积分布
xlabel('主成分')
ylabel('贡献率(%)')
title('主成分贡献率')
% 
input=PCAScores(:,1:4);%利用pca进行降维至3维,从pareto图看,有4维就够了
%%
output=label';

%随机训练样本,预测样本
[m n]=sort(rand(1,750));
m=500;
P_train=input(n(1:m),:)';
T_train=output(n(1:m),:)';
% P_test=input(n(m+1:end),:)';
% T_test=output(n(m+1:end),:)';
P_test=input(n(end),:)';
T_test=output(n(end),:)';
tic
[IW,B,LW,TF,TYPE,T] = elmtrain(P_train,T_train,100,'sig',1);
toc
train_accuracy=sum(T_train==T)/length(T)
figure
stem(T_train,'r*');hold on
plot(T,'bo');
title('训练集')
%% ELM仿真测试
tic
J = elmpredict(P_test,IW,B,LW,TF,TYPE);
toc
J1=T_test;
disp('展示elm的测试集分类')
test_accuracy=sum(J==J1)/length(J)

figure
stem(J,'r*');hold on
plot(J1,'bo');
title('测试集')
function [IW,B,LW,TF,TYPE,T] = elmtrain(P_train,T,N,TF,TYPE)

%P_train=train;T=train_label;N=200;TF='sig';TYPE=1;
% P   - Input Matrix of Training Set  (R*Q)
% T   - Output Matrix of Training Set (S*Q)
% N   - Number of Hidden Neurons (default = Q)
% TF  - Transfer Function:'sig' for Sigmoidal function (default)',sin' for Sine function,'hardlim' for Hardlim function
% TYPE - Regression (0,default) or Classification (1)

% IW  - Input Weight Matrix (N*R)
% B   - Bias Matrix  (N*1)
% LW  - Layer Weight Matrix (N*S)
%回归
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',0)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% 分类
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',1)
% Y = elmtrain(P,IW,B,LW,TF,TYPE)
% See also ELMPREDICT


%显然在这个程序中elmtrain跟了6个参数,正常情况下nargin=6,但是有些省略的时候,就要用到下面几句程序进行默认赋值
if nargin < 2
    error('ELM:Arguments','Not enough input arguments.');
end  %输入参数必须大于等于2个,否则无法进行建模,因为至少要有输出输入参数才行
if nargin < 3
    N = size(P_train,2); %如果只有输入输出,默认隐含层神经元为样本数
end
if nargin < 4
    TF = 'sig';%如果只有输出输入,隐含层神经元数量,默认激活函数为sigmoid函数
end
if nargin < 5
    TYPE = 0;%如果没有定义函数的作用,默认为回归拟合
end
% 其中基本上都是在主程序中定义了那几个参数的,所以上面这几句一般用不到。。。。。。。。。
%%%%%%%%%%%%*****************************

if size(P_train,2) ~= size(T,2)
    error('ELM:Arguments','The columns of P and T must be same.');
end
%输出样本数量必须与输出样本数量一致。
[R,Q] = size(P_train);%R=2,Q=1900
if TYPE  == 1
    T1  = ind2vec(T);
end
                         %如果定义的是分类,就将训练输出转为向量索引   http://blog.csdn.net/u011314012/article/details/51191006
[S,Q] = size(T1); %S=1,Q=1900

% 随机产生输入权重矩阵,1900*2
IW = rand(N,R) * 2 - 1;

% 随机产生隐层偏置 1900*1
B = rand(N,1);
BiasMatrix = repmat(B,1,Q);

% 计算隐层输出H
tempH = IW * P_train + BiasMatrix;
switch TF
    case 'sig'
        H = 1 ./ (1 + exp(-tempH));
    case 'sin'
        H = sin(tempH);
    case 'hardlim'
        H = hardlim(tempH);
end
% 计算隐层到输出层之间的权重
LW = pinv(H') * T1';
TY=(H'*LW)';

if TYPE  == 1
    temp_Y=zeros(1,size(TY,2));
for n=1:size(TY,2)
    [max_Y,index]=max(TY(:,n));
    temp_Y(n)=index;
end
Y_train=temp_Y;
train_accuracy=sum(Y_train==T)/length(T);
end
if TYPE==0
    train_accuracy=0;
end
end
%pinv与inv都是用来求矩阵的逆矩阵,但是inv是知道存在逆矩阵的情况下用的
%当不清楚矩阵是否存在逆矩阵的情况时,或者根本不存在逆矩阵,就用PINV来伪逆矩阵
function Y = elmpredict(P_test,IW,B,LW,TF,TYPE)
% P   - Input Matrix of testing Set  (R*Q)
% IW  - Input Weight Matrix (N*R)
% B   - Bias Matrix  (N*1)
% LW  - Layer Weight Matrix (N*S)
% TF  - Transfer Function:
%       'sig' for Sigmoidal function (default)
%       'sin' for Sine function
%       'hardlim' for Hardlim function
% TYPE - Regression (0,default) or Classification (1)
% Output
% Y   - Simulate Output Matrix (S*Q)

% Regression:
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',0)
% Y = elmpredict(P,IW,B,LW,TF,TYPE)

% Classification
% [IW,B,LW,TF,TYPE] = elmtrain(P,T,20,'sig',1)
% Y = elmpredict(P,IW,B,LW,TF,TYPE)

if nargin < 6
    error('ELM:Arguments','Not enough input arguments.');
end


% Calculate the Layer Output Matrix H
Q = size(P_test,2);
BiasMatrix = repmat(B,1,Q);
tempH = IW * P_test + BiasMatrix;

switch TF
    case 'sig'
        H = 1 ./ (1 + exp(-tempH));
    case 'sin'
        H = sin(tempH);
    case 'hardlim'
        H = hardlim(tempH);
end

% Calculate the Simulate Output
Y = (H' * LW)';


if TYPE == 1
    temp_Y = zeros(size(Y));
    for i = 1:size(Y,2)
        [max_Y,index] = max(Y(:,i));
        temp_Y(index,i) = 1;
    end
    Y = vec2ind(temp_Y); 
end

 

 4 结语

更多内容请点击【专栏】获取。您的点赞是我更新MATLAB1000个案例分析的动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2330980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux第三次作业

1、将你的虚拟机的网卡模式设置为nat模式&#xff0c;给虚拟机网卡配置三个主机位分别为100、200、168的ip地址 2、测试你的虚拟机是否能够ping通网关和dns&#xff0c;如果不能请修改网关和dns的地址 3、将如下内容写入/etc/hosts文件中&#xff08;如果有多个ip地址则写多行&…

国标GB28181视频平台EasyCVR顺应智慧农业自动化趋势,打造大棚实时视频监控防线

一、方案背景 近年来&#xff0c;温室大棚种植技术凭借其显著的优势&#xff0c;在提升农作物产量和质量、丰富农产品供应方面发挥了重要的作用&#xff0c;极大改善了人们的生活水平&#xff0c;得到了广泛的推广和应用。大棚内的温度、湿度、光照度和二氧化碳浓度等环境因素…

HOOPS Visualize:跨平台、高性能的三维图形渲染技术解析

在当今数字化时代&#xff0c;三维可视化技术已成为众多行业的核心竞争力。HOOPS Visualize作为一款功能强大的三维图形渲染引擎&#xff0c;凭借其卓越的渲染能力、跨平台支持、丰富的交互功能、高度定制化以及快速部署等特性&#xff0c;为开发人员提供了构建高质量、高性能3…

蓝桥杯 C/C++ 组历届真题合集速刷(一)

一、1.单词分析 - 蓝桥云课 &#xff08;模拟、枚举&#xff09;算法代码&#xff1a; #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;unordered_map<char,int> mp;for(auto ch:s){mp[ch];}char result_charz;int max_count0;fo…

多类型医疗自助终端智能化升级路径(代码版.上)

大型医疗自助终端的智能化升级是医疗信息化发展的重要方向,其思维链一体化路径需要围绕技术架构、数据流协同、算法优化和用户体验展开: 一、技术架构层:分布式边缘计算与云端协同 以下针对技术架构层的分布式边缘计算与云端协同模块,提供具体编程实现方案: 一、边缘节点…

区间 DP 详解

文章目录 区间 DP分割型合并型环形合并 区间 DP 区间 DP&#xff0c;就是在对一段区间进行了若干次操作后的最小代价&#xff0c;一般是合并和拆分类型。 分割型 分割型&#xff0c;指把一个区间内的几项分开拆成一份一份的&#xff0c;再全部合起来就是当前答案&#xff0c…

QAM 信号的距离以及能量归一化

QAM星座图平均功率能量_星座图功率计算-CSDN博客 正交幅度调制(QAM) - Vinson88 - 博客园 不同阶QAM调制星座图中&#xff0c;符号能量的归一化计算原理_qpsk的星座图归一化-CSDN博客 https://zhuanlan.zhihu.com/p/690157236

Reactive编程框架与工具

文章目录 6.2 后端 Reactive 框架6.2.1 Spring WebFlux核心架构核心组件实际应用高级特性性能优化适用场景与限制 6.2.2 Akka&#xff08;Actor模型&#xff09;Actor模型基础基本用法高级特性响应式特性实现性能优化实际应用场景优势与挑战 6.2.3 Vert.x&#xff08;事件驱动&…

Python爬虫第7节-requests库的高级用法

目录 前言 一、文件上传 二、Cookies 三、会话维持 四、SSL证书验证 五、代理设置 六、超时设置 七、身份认证 八、Prepared Request 前言 上一节&#xff0c;我们认识了requests库的基本用法&#xff0c;像发起GET、POST请求&#xff0c;以及了解Response对象是什么。…

Maven的安装配置-项目管理工具

各位看官&#xff0c;大家早安午安晚安呀~~~ 如果您觉得这篇文章对您有帮助的话 欢迎您一键三连&#xff0c;小编尽全力做到更好 欢迎您分享给更多人哦 今天我们来学习&#xff1a;Maven的安装配置-项目管理工具 目录 1.什么是Maven&#xff1f;Maven用来干什么的&#xff1f…

智能 SQL 优化工具 PawSQL 月度更新 | 2025年3月

&#x1f4cc; 更新速览 本月更新包含 21项功能增强 和 9项问题修复&#xff0c;重点提升SQL解析精度与优化建议覆盖率。 一、SQL解析能力扩展 ✨ 新增SQL语法解析支持 SELECT...INTO TABLE 语法解析&#xff08;3/26&#xff09; ALTER INDEX RENAME/VISIBLE 语句解析&#…

Ubuntu虚拟机编译安装部分OpenCV模块方法实现——保姆级教程

Ubuntu虚拟机的安装过程可以查看另一篇文章&#xff1a;VMware安装Ubuntu虚拟机实现COpenCV代码在虚拟机下运行教程-CSDN博客 目前我们已经下载好了OpenCV&#xff0c;这里以OpenCV4.5.2为例。 在内存要求尽可能小的情况下&#xff0c;可以尝试只编译安装代码中使用到的OpenC…

spring mvc @ResponseBody 注解转换为 JSON 的原理与实现详解

ResponseBody 注解转换为 JSON 的原理与实现详解 1. 核心作用 ResponseBody 是 Spring MVC 的一个注解&#xff0c;用于将方法返回的对象直接序列化为 HTTP 响应体&#xff08;如 JSON 或 XML&#xff09;&#xff0c;而不是通过视图解析器渲染为视图&#xff08;如 HTML&…

skynet.rawcall使用详解及应用场景

目录 核心特性函数原型使用场景场景 1&#xff1a;高性能二进制传输&#xff08;如文件转发&#xff09;场景 2&#xff1a;自定义序列化协议&#xff08;如 Protocol Buffers&#xff09;场景 3&#xff1a;跨服务共享内存&#xff08;避免拷贝&#xff09; 配套接收方实现与 …

使用SpringSecurity下,发生重定向异常

使用SpringSecurity下&#xff0c;发生空转异常 环境信息&#xff1a; Spring Boot 3.4.4 &#xff0c; jdk 17 &#xff0c; springSecurity 6.4.4 问题背景&#xff1a; 没有自定义controller &#xff0c;改写了login 页面&#xff0c;并且进行了成功后的跳转处理&#xf…

Elasticsearch | ES索引模板、索引和索引别名的创建与管理

关注&#xff1a;CodingTechWork 引言 在使用 Elasticsearch (ES) 和 Kibana 构建数据存储和分析系统时&#xff0c;索引模板、索引和索引别名的管理是关键步骤。本文将详细介绍如何通过 RESTful API 和 Kibana Dev Tools 创建索引模板、索引以及索引别名&#xff0c;并提供具…

力扣hot100_回溯(2)_python版本

一、39. 组合总和&#xff08;中等&#xff09; 代码&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一个合法组合ans.append(pa…

LPDDR4内存颗粒命名规则全解析:三星、镁光、海力士、南亚、长鑫等厂商型号解码与选型指南

由于之前DDR的系列选型文章有很好的反馈&#xff0c;所以补充LPDDR4低功耗内存的选型和命名规则&#xff0c;总结了目前市面上常用的内存&#xff0c;供硬件工程师及数码爱好者参考。 在智能手机、平板电脑和低功耗设备中&#xff0c;LPDDR4 SDRAM凭借其高带宽、低功耗特性成为…

【杂谈】Godot4.4导出到Android平台(正式导出)

学博而后可约&#xff0c;事历而后知要。 目录 一、准备二、Gradle构建三、配置Java SDK四、配置Android SDK五、配置密钥 一、准备 本文在前文【杂谈】Godot4.4导出到安卓平台&#xff08;调试导出&#xff09;的基础上&#xff0c;进行正式导出。调试导出并不是真正的编译导…

基于AI设计开发出来的业务系统是什么样的?没有菜单?没有表格?

基于AI设计开发出的业务系统仍然会包含菜单、表格等传统UI元素&#xff0c;但AI技术会显著改变它们的实现方式和交互逻辑。以下是具体分析&#xff1a; 一、传统元素的持续存在 功能刚需性 • 菜单承担着系统导航的核心功能&#xff0c;表格则是结构化数据展示的基础载体。根…