✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)链条张力与驱动电流的多模态特征提取:
刮板输送机链条断裂前会出现张力异常波动和驱动电机电流畸变,提出一种基于奇异谱分析与排列熵联合的特征提取方法。首先在链条两端安装张力传感器,采集张力信号(采样率100Hz),同时从变频器获取三相驱动电流。对张力信号进行奇异谱分析,选择合适的窗口长度L=200,将轨迹矩阵进行奇异值分解,选取前4个主成分重构张力趋势分量,从重构信号中提取均值、方差、峰值因子和峭度。对电流信号进行变分模态分解(K=5),计算每个模态分量的排列熵和能量占比。将张力特征与电流特征拼接成14维特征向量。在井下实际运行的SGZ1000/2000型刮板机上进行数据采集,共记录了7次链条断裂前的完整数据,提前30秒特征出现显著变化。该方法在断链前60秒的预警准确率为92%。
(2)基于时间卷积网络与注意力机制的剩余强度预测:
建立了TCANet模型来预测链条剩余抗拉强度。输入为过去300秒的张力、电流、温度等多传感器时序数据,经过三层膨胀因果卷积(卷积核大小5,膨胀率1,2,4),每层后接门控激活和残差连接。然后在通道维度上引入挤压-激励注意力模块,自动加权重要特征通道。最后通过全局平均池化和全连接层输出剩余强度百分比(0~100)。在链条寿命加速试验台上(模拟磨损和拉伸),以实际拉断试验结果为标签,该模型预测剩余强度的均方根误差为6.8%,当预测强度低于25%时发出报警,实际断链发生在报警后平均4.2小时,虚警率为7%。
(3)小样本条件下的链条健康状态聚类方法:
由于链条断裂是小概率事件,正常样本远多于断裂样本。设计了一种基于深度支持向量数据描述的无监督健康监测框架DSVDD-chains。首先利用大量正常状态数据训练一个深度自编码器,编码器将高维多传感器特征压缩到低维隐空间,解码器重构原始信号。训练完成后,固定编码器参数,提取所有正常样本的隐空间特征,计算这些特征的中心点C。在线监测时,将新样本通过编码器得到特征z,计算其到中心C的距离作为异常得分。当得分超过阈值(正常样本得分的99.5分位数)时判定为异常预警。在只有正常样本训练的条件下,该方法成功提前35秒检测到所有7次断链事件,误报率控制在0.5次/小时。,"import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
from scipy.linalg import svd
def singular_spectrum_analysis(x, L=200):
N = len(x)
K = N - L + 1
X = np.zeros((L, K))
for i in range(K):
X[:,i] = x[i:i+L]
U, S, Vt = svd(X, full_matrices=False)
reconstructed = np.zeros(N)
for i in range
(4):
component = np.zeros((L, K))
for m in range(L):
for n in range(K):
component[m,n] = U[m,i] * S[i] * Vt[i,n]
for m in range(L):
for n in range(K):
reconstructed[m+n] += component[m,n] / (min(m+1, L, K-m, N-K+1)) # 对角平均简化
return reconstructed
class TemporalConvBlock(nn.Module):
def __init__(self, in_ch, out_ch, kernel=5, dilation=1):
super().__init__()
padding = (kernel-1)*dilation // 2
self.conv1 = nn.Conv1d(in_ch, out_ch, kernel, dilation=dilation, padding=padding)
self.conv2 = nn.Conv1d(out_ch, out_ch, kernel, dilation=dilation, padding=padding)
self.gate = nn.Conv1d(out_ch, out_ch, kernel, dilation=dilation, padding=padding)
self.res = nn.Conv1d(in_ch, out_ch, 1) if in_ch != out_ch else nn.Identity()
def forward(self, x):
out = F.relu(self.conv1(x))
out = torch.tanh(self.conv2(out)) * torch.sigmoid(self.gate(out))
return out + self.res(x)
class SqueezeExcitation(nn.Module):
def __init__(self, channels, reduction=8):
super().__init__()
self.gap = nn.AdaptiveAvgPool1d(1)
self.fc = nn.Sequential(
nn.Linear(channels, channels//reduction, bias=False),
nn.ReLU(),
nn.Linear(channels//reduction, channels, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b,c,t = x.shape
w = self.gap(x).view(b,c)
w = self.fc(w).view(b,c,1)
return x * w
class TCANet(nn.Module):
def __init__(self, in_dim=8, out_dim=1):
super().__init__()
self.conv1 = TemporalConvBlock(in_dim, 32, dilation=1)
self.conv2 = TemporalConvBlock(32, 64, dilation=2)
self.conv3 = TemporalConvBlock(64, 128, dilation=4)
self.se = SqueezeExcitation(128)
self.gap = nn.AdaptiveAvgPool1d(1)
self.fc = nn.Linear(128, out_dim)
def forward(self, x):
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
x = self.se(x)
x = self.gap(x).squeeze(-1)
return F.relu(self.fc(x))
class DeepSVDD(nn.Module):
def __init__(self, encoder, center):
super().__init__()
self.encoder = encoder
self.center = center
def forward(self, x):
z = self.encoder(x)
dist = torch.sum((z - self.center)**2, dim=1)
return dist
def train_deep_svdd(model, train_loader, lr=1e-3, epochs=50):
optimizer = torch.optim.Adam(model.encoder.parameters(), lr=lr)
for epoch in range(epochs):
for batch in train_loader:
z = model.encoder(batch)
loss = torch.mean(torch.sum((z - model.center)**2, dim=1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 每10个epoch更新中心点为所有特征均值
if epoch % 10 == 0:
with torch.no_grad():
all_z = torch.cat([model.encoder(b) for b in train_loader])
model.center.data = torch.mean(all_z, dim=0)
return model
如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇