✅博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 如需沟通交流,扫描文章底部二维码。
(1)多层次改进多样性熵振动特征提取:
针对船舶齿轮箱全寿命周期振动信号非线性、非平稳特性导致传统熵值指标单调性差的问题,提出MIDE方法。MIDE在经典多尺度熵的基础上,引入动态重标定因子替代固定尺度平均,依据每个尺度下粗粒化序列的方差调整权重,方差越大表示局部波动越剧烈,赋予更高的熵值权重。同时采用改进的多样性度量,不是简单统计模式种类,而是考虑模式的出现概率分布与均匀分布的KL散度。在Adams动力学仿真生成的齿轮裂纹退化数据(从健康到断裂共15个阶段)上,MIDE提取的健康指标单调性指数达到0.86,趋势性指数0.91,显著优于多尺度熵(单调性0.71)和层次熵(0.68)。采用滑动窗口实时计算MIDE序列,可清晰观察到故障萌生和加速退化两个拐点。","
(2)双向门控循环单元与健康指标融合的RUL预测:
将MIDE提取的多维熵特征(在10个尺度下的值)作为输入序列,构建BiGRU网络进行剩余寿命预测。BiGRU同时处理前向和后向时序依赖,适合捕捉退化过程的双向演化规律。网络输出为剩余寿命百分比(0~1之间)。在齿轮箱全寿命试验数据上(共8组,每组约2000个采样点),预测均方根误差为5.97%,平均绝对百分比误差为8.3%。对比单向GRU(RMSE 8.2%)和LSTM(7.9%),BiGRU精度最高且参数量最小。将MIDE与振动均方根值进行相关性分析,发现MIDE的预测窗口更长,在寿命中期就能识别退化趋势,而RMS只在临近失效时才明显上升。通过贝叶斯超参数优化,确定了BiGRU的最优隐藏层维度为128,层数为2,学习率0.001。","
(3)仿真数据与试验数据融合的迁移寿命预测:
针对船舶齿轮箱全寿命数据难以获得的问题,建立基于Adams的多体动力学仿真模型,模拟齿轮裂纹从0.5mm到3mm的渐进扩展过程,生成多阶段振动仿真数据。使用仿真数据预训练MIDE-BiGRU模型,再用少量真实试验数据(仅前两个齿轮的完整寿命数据)进行微调。迁移学习策略冻结BiGRU的前两层参数,只微调最后一层和输出层。在剩余4个齿轮的测试中,微调后的模型RMSE为6.3%,而仅用仿真数据训练的模型RMSE为13.8%,仅用少量真实数据训练的模型由于数据不足RMSE为11.2%。仿真与真实数据之间的最大均值差异从0.42降到微调后的0.15,证明了特征空间的对齐效果。该方法使得新机型齿轮箱的RUL预测成为可能,无需等待其完成全寿命试验。
import numpy as np from scipy.signal import hilbert import torch import torch.nn as nn def multiscale_improved_diversity_entropy(signal, max_scale=10, m=3): def diversity_entropy(x): n = len(x) patterns = [] for i in range(n-m+1): pat = tuple(np.sign(x[i+1:i+m] - x[i:i+m-1]).astype(int)) patterns.append(pat) _, counts = np.unique(patterns, return_counts=True) probs = counts / len(patterns) # KL散度到均匀分布 unif = np.ones_like(probs) / len(probs) kl = np.sum(probs * np.log((probs+1e-10)/(unif+1e-10))) return kl mide = [] for scale in range(1, max_scale+1): # 粗粒化 coarse = np.mean(signal.reshape(len(signal)//scale, scale), axis=1) de = diversity_entropy(coarse) # 动态重标定因子 = 方差倒数 var = np.var(coarse) weight = 1.0 / (var + 1e-6) mide.append(de * weight) return np.array(mide) class BiGRU_RUL(nn.Module): def __init__(self, input_dim=10, hidden=128, num_layers=2): super().__init__() self.gru = nn.GRU(input_dim, hidden, num_layers, batch_first=True, bidirectional=True) self.fc = nn.Linear(hidden*2, 1) def forward(self, x): out, _ = self.gru(x) return torch.sigmoid(self.fc(out[:, -1, :])) def transfer_finetune(source_model, target_loader, freeze_layers=2): # 冻结前freeze_layers的GRU层 for name, param in source_model.named_parameters(): if 'gru.weight_ih_l0' in name or 'gru.weight_hh_l0' in name: param.requires_grad = False optimizer = torch.optim.Adam(filter(lambda p: p.requires_grad, source_model.parameters()), lr=0.0001) # 微调循环 for epoch in range(30): for x, y in target_loader: pred = source_model(x) loss = F.mse_loss(pred, y) optimizer.zero_grad() loss.backward() optimizer.step() return source_model如有问题,可以直接沟通
👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇👇