✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)基于自适应变分模态分解的摆线轮振动特征增强:
RV减速器摆线轮故障时振动信号呈现周期性冲击与非平稳调制特性,传统VMD参数依赖经验。提出一种改进的自适应VMD方法,使用差分进化算法联合优化分解层数K和惩罚因子α,目标函数采用加权包络熵与模态相关度组合。首先对原始加速度信号进行CEEMDAN预分解估计K的范围,然后在[3,15]区间内搜索最优K,同时α在[200,4000]范围内寻优。对分解出的本征模态分量,计算每个分量的循环平稳度指标,选取循环平稳度大于0.6的分量进行信号重构。在RV-40E型减速器试验台上采集了正常、摆线轮齿面磨损、齿根裂纹、断齿四种状态共1200组信号,该方法重构后的信噪比较原始信号提高11.8dB,故障特征频率幅值增强3.2倍。
(2)多尺度残差图卷积网络诊断模型RV-GCN:
将振动信号的时域、频域和时频域特征构建为图结构数据,节点为不同尺度的特征片段,边为特征之间的相似度。设计了一种多尺度残差图卷积网络,首先使用三个并行的一维空洞卷积层(扩张率分别为1,2,4)提取原始信号的多尺度局部特征,每个卷积后接批量归一化和ReLU。然后将每个尺度下的特征片段作为图节点,计算节点间的余弦相似度作为邻接矩阵,形成三个尺度图。接着采用两层的图卷积网络对每个尺度图进行消息传递,输出节点级特征。最后引入残差连接,将输入多尺度特征直接与图卷积输出相加,再通过全局平均池化和全连接分类。在凯斯西储大学轴承数据迁移到RV减速器数据的实验中,该方法准确率达到96.8%,比标准1D-CNN高出9.5个百分点。
(3)基于孪生对比学习的少样本故障诊断策略:
实际工业中摆线轮故障样本极少,构造了一种孪生对比学习框架SCL-RV。该框架由特征提取编码器(ResNet-1D)、投影头(两层MLP)和对比损失函数组成。训练阶段采用无标签的正常样本和少量故障样本,通过数据增强(随机缩放、加噪、时移)生成正负样本对。对比损失优化使得同类样本特征距离小,异类样本特征距离大。训练完成后,冻结编码器,仅用每类5个标注样本训练一个线性分类器。在只有每类10个样本的小样本设置下,该方法诊断准确率为91.2%,而直接监督训练准确率仅为63.5%。,"import torch
import torch.nn as nn
import torch.nn.functional as F
from scipy.signal import hilbert
import numpy as np
from deap import base, creator, tools, algorithms
def fitness_vmd(params, signal):
K, alpha = int(params[0]), params[1]
imfs = vmd_decompose(signal, K, alpha) # 伪实现
total_envelope_entropy = 0
for imf in imfs:
analytic = hilbert(imf)
envelope = np.abs(analytic)
hist, _ = np.histogram(envelope, bins=50, density=True)
hist = hist[hist>0]
ent = -np.sum(hist * np.log2(hist))
total_envelope_entropy += ent
return -total_envelope_entropy,
class MultiScaleDilatedConv(nn.Module):
def __init__(self, in_ch=1, out_ch=64, kernel=3):
super().__init__()
self.conv1 = nn.Conv1d(in_ch, out_ch, kernel, dilation=1, padding=1)
self.conv2 = nn.Conv1d(in_ch, out_ch, kernel, dilation=2, padding=2)
self.conv3 = nn.Conv1d(in_ch, out_ch, kernel, dilation=4, padding=4)
self.bn = nn.BatchNorm1d(out_ch*3)
def forward(self, x):
f1 = F.relu(self.conv1(x))
f2 = F.relu(self.conv2(x))
f3 = F.relu(self.conv3(x))
out = torch.cat([f1, f2, f3], dim=1)
return self.bn(out)
class GCNLayer(nn.Module):
def __init__(self, in_dim, out_dim):
super().__init__()
self.W = nn.Linear(in_dim, out_dim)
def forward(self, A, H):
# A: normalized adjacency matrix
support = torch.matmul(A, H)
out = self.W(support)
return F.relu(out)
class RVGCN(nn.Module):
def __init__(self, node_dim=64, num_nodes=32):
super().__init__()
self.msd = MultiScaleDilatedConv()
self.gcn1 = GCNLayer(node_dim, node_dim)
self.gcn2 = GCNLayer(node_dim, 32)
self.fc = nn.Linear(32*num_nodes, 4)
def forward(self, x, A):
x = self.msd(x) # (B, C, L)
B,C,L = x.shape
x = x.view(B, C, L//(L//num_nodes), -1).mean(dim=2) # 降采样到num_nodes节点
x = x.permute(0,2,1) # (B, num_nodes, C)
x = self.gcn1(A, x)
x = self.gcn2(A, x)
x = x.reshape(B, -1)
return self.fc(x)
class ContrastiveLoss(nn.Module):
def __init__(self, temperature=0.5):
super().__init__()
self.temp = temperature
def forward(self, z, labels):
z = F.normalize(z, dim=-1)
sim = torch.matmul(z, z.T) / self.temp
mask = torch.eye(len(z), device=z.device).bool()
sim = sim.masked_fill(mask, -1e9)
pos_mask = labels.unsqueeze(1) == labels.unsqueeze(0)
pos_mask = pos_mask.fill_diagonal_(False)
exp_sim = torch.exp(sim)
pos_exp = (exp_sim * pos_mask).sum(dim=1)
neg_exp = (exp_sim * (~pos_mask)).sum(dim=1)
loss = -torch.log(pos_exp / (neg_exp + 1e-8)).mean()
return loss
如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇