news 2026/10/13 13:03:47

强化学习驱动的炼钢动态调度代理:3秒内满足全工艺约束

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
强化学习驱动的炼钢动态调度代理:3秒内满足全工艺约束

简介:本资源是一套面向工业智能优化领域的强化学习实践方案,聚焦炼钢生产过程中的动态调度难题,适用于具备Python基础与机器学习背景的算法工程师、自动化专业研究生及智能制造方向研究者。资源通过构建马尔可夫决策过程建模调度任务,集成DDPG、PG等主流策略梯度算法,提供从环境模拟(environment.py)、智能体实现(agents.py)、模型训练(train.py/DDPG.py/PG.py)到可视化交互(ui.py)的完整闭环代码体系。压缩包共17个文件,含13个核心Python脚本(覆盖算法实现、训练逻辑与实验配置)、3个预训练.pth模型权重及1份README.md说明文档,整体仅930KB,轻量易部署。已有181人学习下载,读者可直接复现炼钢调度强化学习求解流程,获取可调试的模块化代码结构、典型控制环境适配范例及端到端训练-测试-验证链路,为工业场景下无模型在线优化提供扎实的技术原型支撑。

1. 炼钢调度为什么不能靠“经验+Excel”硬扛:当转炉节奏偏差0.8分钟,整条产线就多压32吨钢水

某钢铁企业热轧车间曾用一套沿用了12年的排程逻辑:人工预估铁水温度、查历史炉次表、在Excel里拖拽调整浇次顺序,再电话通知连铸机。直到一次突发性铁水温降异常——实际比预估低42℃,系统未触发重调度,结果第三炉钢水在LF精炼站滞留超时,导致后续RH真空处理窗口错失,最终整浇次成分偏析,216吨板坯判废。这不是孤例。炼钢-连铸-热轧全流程存在强耦合、高不确定性(铁水成分波动±0.15%、设备故障率日均0.7%、能源价格分钟级跳变)、硬约束密集(连铸机换包间隔≤90秒、转炉出钢温控窗口±5℃)三大特征,传统规则引擎或MILP求解器在动态扰动下平均重调度耗时达4.3分钟,远超现场可接受的90秒响应阈值。本方案不替换现有DCS或MES,而是以强化学习为内核,构建一个轻量级、可嵌入式部署的动态调度代理(Dynamic Scheduling Agent, DSA),专治“计划刚排好,现场已变样”的顽疾。它面向两类人:一是产线自动化工程师,需在不改动底层PLC逻辑前提下快速接入实时调度能力;二是工艺优化团队,想验证新排程策略对成材率、电耗等KPI的真实影响。核心价值不是“更准”,而是“更快稳准”——在3秒内给出满足全部工艺约束的可行解,且连续72小时调度成功率≥99.2%。

2. 为什么选PPO而非DQN或SAC:炼钢状态空间的稀疏奖励与安全边界硬约束

2.1 炼钢调度问题如何被建模成马尔可夫决策过程(MDP)

把整个炼钢-连铸流程抽象为一个持续运行的MDP,关键在于定义四元组(S, A, R, T):

  • 状态S:不是简单罗列设备ID和温度值。我们采用分层状态编码:

    • 宏观层:当前各工位(铁水罐、转炉、LF、RH、连铸机)的剩余处理时间、物料等待队列长度、能源价格等级(分5档)、下一计划浇次的钢种/规格/目标温度;
    • 微观层:最近3炉钢水的实际出钢温度偏差(vs. 目标值)、连铸机当前拉速与历史最优拉速比值、RH真空泵当前负载率;
    • 时序层:过去5个时间步(每步=30秒)的调度动作序列one-hot编码。
      这种设计让智能体能同时感知长期趋势(如能源峰谷)和瞬时扰动(如某台RH泵突然报警),状态向量维度为137维,经PCA降维至89维后保留98.3%方差。
  • 动作A:不是直接输出“第X炉去第Y工位”。动作空间被设计为约束引导型离散动作集:共47个原子动作,例如:
    A1: 将队列首炉钢水分配至空闲转炉(若存在)
    A12: 强制提前结束LF精炼(仅当当前温升速率<0.8℃/min且距目标温差>15℃)
    A37: 启动连铸机应急降速模式(拉速×0.85,仅当结晶器液面波动>±3mm)
    所有动作均内置硬约束校验(如转炉空闲时间≥210秒才允许分配),避免生成非法解。

  • 奖励R:拒绝稀疏奖励陷阱。我们设计三级奖励函数:

    • 即时奖励(占权重40%):每步执行后计算100 - max(0, 实际处理时长 - 标准处理时长) × 2.5;
    • 约束惩罚(占权重35%):违反温度窗口扣50分/次,违反换包间隔扣200分/次;
    • KPI导向奖励(占权重25%):每完成一浇次,按成材率提升幅度给予额外奖励(如成材率+0.3%,奖励+80分)。
      关键技巧:所有惩罚项设置上限(单步最高扣300分),防止智能体因惧怕惩罚而彻底停滞。
  • 转移T:环境动力学由高保真数字孪生体驱动。我们基于某钢厂2022-2023年14.7万炉次生产数据,用LSTM训练了设备状态演化模型(预测转炉出钢温误差RMSE=2.1℃,连铸机故障概率预测AUC=0.91),替代真实产线进行百万级仿真训练。

2.2 PPO算法在炼钢场景的三重适配改造

原始PPO在连续控制任务中表现优异,但炼钢调度是离散动作+强约束+稀疏奖励的混合体。我们做了三项关键改造:

  • 动作头分离(Action Head Separation):将47个原子动作按功能分组:分配类(18个)、参数调节类(15个)、应急处置类(14个)。网络输出三个独立logits头,每个头用Gumbel-Softmax采样,再通过门控机制融合——只有当分配类动作置信度>0.6且参数调节类置信度>0.4时,才允许组合执行(如“分配至转炉A”+“设定吹氧量+5%”)。这避免了DQN常见的动作震荡问题。

  • 约束投影层(Constraint Projection Layer):在Actor网络最后一层添加可微分约束校验模块。例如,对“分配至转炉”动作,输入当前转炉空闲时间t_idle,输出t_idle > 210 ? 1 : 0的软掩码,乘以原始logits。该层梯度可反向传播,使网络主动学习规避约束冲突。

  • 课程奖励塑形(Curriculum Reward Shaping):训练分三阶段:
    第1阶段(0-200万步):只给即时奖励,忽略KPI奖励,让智能体先学会基础节奏匹配;
    第2阶段(200-500万步):加入约束惩罚,但将温度窗口容差放宽至±8℃,降低初期学习难度;
    第3阶段(500万步后):启用完整奖励函数,容差收紧至±5℃。实测收敛速度提升3.2倍,最终策略稳定性提高47%。

# constraint_projection_layer.py:可微分约束校验示例 import torch import torch.nn as nn class ConstraintProjectionLayer(nn.Module): def __init__(self, action_dim=47): super().__init__() self.action_dim = action_dim # 预定义47个动作对应的约束条件ID(如0-17为分配类,需校验设备空闲时间) self.action_constraints = torch.tensor([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, # 分配类:约束ID=0 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, # 参数类:约束ID=1 2,2,2,2,2,2,2,2,2,2,2,2,2,2 # 应急类:约束ID=2 ]) def forward(self, logits, state_features): """ logits: [batch, 47] 原始动作logits state_features: [batch, 89] 状态特征,含设备空闲时间等 """ # 提取关键约束变量:t_idle(转炉空闲时间,索引23)、temp_diff(温差,索引41) t_idle = state_features[:, 23] # 单位:秒 temp_diff = torch.abs(state_features[:, 41]) # 温差绝对值 # 为每类动作生成软掩码 mask_alloc = (t_idle > 210).float().unsqueeze(1) # 分配类掩码 mask_param = (temp_diff < 8.0).float().unsqueeze(1) # 参数类掩码(初期宽松) # 构建全动作掩码向量 mask = torch.ones_like(logits) alloc_mask = mask_alloc.expand(-1, 18) # 前18维 param_mask = mask_param.expand(-1, 15) # 中15维 mask[:, :18] = alloc_mask mask[:, 18:33] = param_mask # 应用掩码并重归一化 masked_logits = logits + (mask - 1) * 1e8 # soft masking return torch.log_softmax(masked_logits, dim=-1) # 使用示例:在PPO Actor网络中插入 # actor_net = nn.Sequential( # nn.Linear(89, 256), # nn.ReLU(), # nn.Linear(256, 256), # nn.ReLU(), # ConstraintProjectionLayer() # 关键:约束即网络层 # )

这段代码的核心价值在于:它把“转炉必须空闲210秒才能接炉”这个工艺铁律,从外部if判断变成了神经网络内部可学习、可微分的结构。当智能体尝试违反约束时,梯度会明确告诉它“这条路走不通”,而不是让它在无效区域盲目探索。这是PPO能在此类强约束问题中胜过DQN的关键——DQN的ε-greedy探索无法保证每次采样都满足硬约束,而PPO通过约束投影层实现了探索即合法。

3. 软件实现:从PyTorch模型到嵌入式DLL,3步完成产线集成

3.1 模型导出:ONNX格式封装与推理加速

训练好的PPO模型需脱离PyTorch框架,在产线工控机(Windows Server 2019, Intel Xeon E5-2678 v3)上以<15ms延迟运行。我们放弃TensorRT(需NVIDIA GPU,产线无此配置),选择ONNX Runtime CPU后端:

  • 导出前剪枝:对Actor网络进行通道剪枝(Channel Pruning),依据每层卷积核的L1范数,移除贡献度最低的12%通道,模型体积减少37%,推理速度提升2.1倍,精度损失<0.3%(在验证集上调度成功率从99.2%→98.9%)。

  • ONNX导出关键参数:

    python -m torch.onnx.export \ --opset-version 15 \ --dynamic-axis "state_input" {0: "batch"} \ --input-names "state_input" \ --output-names "action_probs" \ actor_model.pth \ dsa_actor.onnx

    注意:必须指定--opset-version 15,否则ONNX Runtime 1.15+版本会报Unsupported operator 'Softmax' with domain ''错误(旧版OPSET对Softmax支持不完善)。

  • ONNX Runtime推理优化:启用ExecutionMode.ORT_SEQUENTIAL(禁用并行,避免工控机多核调度抖动),线程数固定为4(匹配CPU物理核心数),关闭内存复用(arena_extend_strategy=0),实测P99延迟稳定在12.3ms。

3.2 C++封装:生成可被C# MES调用的DLL

产线MES系统为C#开发,需提供标准DLL接口。我们用C++/CLI桥接ONNX Runtime C API:

// DSAEngine.h #pragma once #include <onnxruntime_cxx_api.h> #include <vector> extern "C" { // 初始化函数:传入ONNX模型路径 __declspec(dllexport) bool __cdecl InitDSA(const char* model_path); // 推理函数:输入137维状态数组,输出47维动作概率 __declspec(dllexport) bool __cdecl GetActionProb( const float* state_array, // 输入:137维浮点数组 float* action_probs, // 输出:47维概率数组 int* selected_action // 输出:最高概率动作ID(0-46) ); // 清理资源 __declspec(dllexport) void __cdecl CleanupDSA(); }
// DSAEngine.cpp 关键实现 #include "DSAEngine.h" #include <onnxruntime_cxx_api.h> #include <mutex> static Ort::Env* g_env = nullptr; static Ort::Session* g_session = nullptr; static std::mutex g_inference_mutex; bool __cdecl InitDSA(const char* model_path) { try { // 创建ONNX Runtime环境(单例) g_env = new Ort::Env(OrtLoggingLevel::ORT_LOGGING_LEVEL_WARNING); // 配置会话选项:禁用图优化(避免产线环境兼容性问题) Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(4); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_DISABLE_ALL); // 加载模型 g_session = new Ort::Session(*g_env, model_path, session_options); return true; } catch (const std::exception& e) { return false; } } bool __cdecl GetActionProb( const float* state_array, float* action_probs, int* selected_action ) { if (!g_session) return false; std::lock_guard<std::mutex> lock(g_inference_mutex); // 线程安全 // 构建输入tensor:[1, 137] std::vector<int64_t> input_shape{1, 137}; Ort::Value input_tensor = Ort::Value::CreateTensor<float>( Ort::MemoryInfo::CreateCpu(OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault), const_cast<float*>(state_array), 137, input_shape.data(), 2 ); // 执行推理 const char* input_names[] = {"state_input"}; const char* output_names[] = {"action_probs"}; auto output_tensors = g_session->Run( Ort::RunOptions{nullptr}, input_names, &input_tensor, 1, output_names, 1 ); // 复制输出 auto output_tensor = output_tensors.front().GetTensorData<float>(); std::copy(output_tensor, output_tensor + 47, action_probs); // 找最大概率动作 *selected_action = std::max_element(action_probs, action_probs + 47) - action_probs; return true; }

编译命令(x64 Release):

cl /LD /O2 /EHsc /I"C:\onnxruntime\include" DSAEngine.cpp ^ /link "C:\onnxruntime\lib\onnxruntime.lib" /OUT:DSAEngine.dll

提示:必须使用与ONNX Runtime预编译库完全匹配的Visual Studio版本(我们用VS2019 v142工具集),否则会出现LNK2019: unresolved external symbol链接错误。产线工控机无需安装ONNX Runtime,DLL已静态链接其C API。

3.3 MES系统集成:C#调用DLL并对接OPC UA数据源

在C# MES中,我们创建DSAScheduler类封装DLL调用,并通过OPC UA订阅实时数据:

public class DSAScheduler { private const string DllPath = @"C:\DSA\DSAEngine.dll"; [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)] private static extern bool InitDSA(string modelPath); [DllImport(DllPath, CallingConvention = CallingConvention.Cdecl)] private static extern bool GetActionProb( float[] stateArray, float[] actionProbs, ref int selectedAction); private readonly OpcUaClient _opcClient; private readonly float[] _stateArray = new float[137]; private readonly float[] _actionProbs = new float[47]; public DSAScheduler() { // 初始化OPC UA客户端,订阅关键节点 _opcClient = new OpcUaClient("opc.tcp://10.1.2.100:4840"); _opcClient.SubscribeNode("ns=2;s=IronTemp", (val) => _stateArray[0] = (float)val); _opcClient.SubscribeNode("ns=2;s=ConverterIdleTime", (val) => _stateArray[23] = (float)val); // ... 订阅其余135个节点 } public async Task<int> GetNextActionAsync() { // 1. 从OPC UA读取最新状态,填入_stateArray await _opcClient.ReadAllNodesAsync(_stateArray); // 2. 调用DLL推理 var selectedAction = -1; var success = GetActionProb(_stateArray, _actionProbs, ref selectedAction); if (!success) throw new Exception("DSA inference failed"); // 3. 将动作ID映射为MES可执行指令 return MapActionToCommand(selectedAction); } private int MapActionToCommand(int actionId) { // 动作ID到MES指令的映射表(47行,此处省略) // 例如:actionId=5 → "MOVE_LADLE_TO_CONVERTER_A" return _actionMap[actionId]; } }

集成要点:

  • OPC UA订阅采用循环轮询+缓存策略,每500ms批量读取一次,避免高频订阅冲击PLC;
  • GetNextActionAsync()被封装为MES的ScheduleNextHeat()服务,供APS高级排程模块按需调用;
  • DLL初始化在MES服务启动时完成,避免每次调度都加载模型(实测首次加载耗时820ms,后续<5ms)。

4. 避坑:炼钢调度RL落地的5个血泪教训

4.1 现象:模型在仿真环境成功率99.5%,上线后首日调度失败率达38%

原因:仿真环境使用LSTM预测设备状态,但未模拟PLC扫描周期抖动。真实产线中,OPC UA数据更新存在120-350ms随机延迟,导致状态向量中“连铸机拉速”字段在连续3个推理周期内重复使用同一数值,引发动作震荡。
解决:在C#数据采集层增加滑动窗口滤波:对每个OPC节点维护长度为5的环形缓冲区,取中位数作为有效值;同时在状态向量中新增“数据新鲜度标志位”(0=新鲜,1=缓存),供Actor网络学习补偿策略。

4.2 现象:PPO训练后期出现策略崩溃——连续数百步选择“暂停所有操作”动作

原因:奖励函数中KPI导向奖励占比过高(原设25%),且成材率数据来自MES历史报表,存在2小时延迟。智能体发现“只要不调度,就能避免因延迟数据导致的误判惩罚”,从而学会消极策略。
解决:将KPI奖励改为滞后奖励:在完成一浇次后,等待MES确认成材率数据入库(通过监听数据库CDC日志),再回溯奖励至该浇次首个调度动作步。同时将KPI奖励权重降至12%,强化即时奖励主导性。

4.3 现象:工控机上DLL推理偶尔卡死,CPU占用率100%持续15秒

原因:ONNX Runtime默认启用arena_extend_strategy=1(自动扩展内存池),但在工控机内存受限(16GB)且长时间运行场景下,内存池碎片化导致malloc阻塞。
解决:在InitDSA()中显式设置内存策略:

session_options.AddConfigEntry("session.arena_extend_strategy", "0"); // 0=never extend session_options.AddConfigEntry("session.inter_op_num_threads", "1");

4.4 现象:连铸机换包时,模型频繁触发“应急降速”动作,导致拉速波动超标

原因:状态向量中“结晶器液面波动”字段直接使用PLC原始值(单位:mm),但该信号存在高频噪声(±0.5mm毛刺)。模型将噪声误判为真实波动。
解决:在OPC UA数据采集层增加二阶巴特沃斯低通滤波(截止频率2Hz),并在状态向量中同时输入原始值和滤波后值,让网络自主学习区分噪声与真实扰动。

4.5 现象:模型对“铁水温降异常”响应迟钝,仍按原计划排产

原因:状态编码中“铁水温降率”使用过去30秒平均值,但突发性温降(如铁水罐盖板意外开启)在30秒窗口内被平滑掉。
解决:引入瞬时变化率检测:计算当前值与1秒前值的差分,若绝对值>3℃/s,则在状态向量中置位“温降突变标志”(布尔值),并放大其在输入层的权重系数(从1.0→3.5)。

5. 验证与调优:用“对抗测试集”代替传统准确率指标

5.1 构建产线级对抗测试集(Adversarial Test Set)

传统测试用历史数据切片,但无法暴露策略脆弱性。我们构建了三类对抗样本:

测试类型构造方法占比典型失效场景
设备故障注入在仿真环境中随机使转炉倾动电机故障(概率0.3%/分钟),强制中断当前炉次40%模型未及时将炉次重分配至备用转炉,导致LF精炼超时
原料扰动将铁水硅含量从[0.35%, 0.55%]突变为[0.12%, 0.18%],触发脱硅剂用量重算35%模型忽略成分变化对RH处理时间的影响,仍按原时长排程
能源价格闪变模拟电网峰谷切换,电价在15秒内从0.45元/kWh跳至1.2元/kWh25%模型过度追求节能,将高附加值钢种排至高价时段,违反合同约定

该测试集共12,840个扰动场景,覆盖产线近3年所有重大异常类型。模型在对抗测试集上的“约束满足率”(所有硬约束100%满足)成为核心KPI,而非传统准确率。

5.2 三阶段在线调优协议(Online Tuning Protocol)

上线后不冻结模型,而是建立闭环调优机制:

  • 阶段1:影子模式(Shadow Mode)
    DSA模型与原MES排程并行运行,但不下发指令。每日自动比对两者输出,当差异率>15%时,触发根因分析(如:是否因某传感器漂移导致状态编码异常?)。持续30天,收集217个高价值差异样本加入训练集。

  • 阶段2:A/B测试(A/B Testing)
    将产线划分为A/B两组(如A组为1#-3#转炉,B组为4#-6#转炉),A组用旧规则,B组用DSA。每周对比KPI:

    • 成材率提升Δ ≥0.25% → 通过
    • 平均调度响应时间 ≤90秒 → 通过
    • 约束违反次数 ≤2次/周 → 通过
      任一指标未达标,自动回滚并启动模型诊断。
  • 阶段3:增量学习(Incremental Learning)
    每周用新产生的扰动数据(经人工标注是否为有效扰动)微调模型最后两层。关键限制:

    • 学习率衰减至1e-5,防止灾难性遗忘;
    • 新增样本必须通过“扰动显著性检验”:其状态向量与训练集中心距离 > 3σ;
    • 微调后必须通过对抗测试集全量回归(失败率上升>0.5%则拒绝更新)。

5.3 工程师必备的3个诊断技巧

当调度异常发生时,不要先看模型,按此顺序排查:

  1. 查OPC UA数据新鲜度:
    运行opc_diag.exe --node "ns=2;s=ConverterIdleTime" --history 60,检查过去60秒内该节点更新间隔是否稳定在500±50ms。若出现>1000ms断点,说明PLC通信异常,立即切换至本地缓存模式。

  2. 抓取状态向量快照:
    在DLL中添加调试接口ExportCurrentState(),当selected_action==46(紧急停机)时,自动保存_stateArray到C:\DSA\debug\state_20240521_142305.bin。用Python加载分析:

    import numpy as np state = np.fromfile(r"C:\DSA\debug\state_20240521_142305.bin", dtype=np.float32) print(f"Idle time: {state[23]:.1f}s, Temp diff: {state[41]:.1f}℃") # 定位具体异常维度
  3. 可视化动作概率分布:
    在MES界面嵌入实时概率图(使用LiveCharts2),监控47个动作的概率变化。典型健康信号:

    • 正常调度时,Top3动作概率和>0.85;
    • 出现扰动时,Top1概率短暂跌至0.4~0.6,但Top3和迅速回升;
    • 若Top1概率持续<0.3且分布扁平(熵>3.2),表明模型陷入不确定状态,需人工介入。

我坚持一个习惯:每次模型更新后,必在仿真环境跑完全部12,840个对抗样本,并手动生成一份《失效模式报告》(FMEA Report),列出前5个最高频失效场景及对应的状态向量特征。这份报告比任何准确率数字都更能告诉我——模型到底学会了什么,又在哪里还像个新手。它逼着我把“黑匣子”拆开,看到每一层神经元在炼钢逻辑下的真实含义。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 13:02:56

字节跳动开源TREA深度体验:不只是AI补全,更是Coding Agent

字节跳动开源TREA这件事&#xff0c;在AI编程工具圈里热度一直没降过。我身边不少同事第一时间就下载了&#xff0c;有人拿它当主力编辑器&#xff0c;有人只是尝个鲜。我大概连续用了三天&#xff0c;把安装、模型接入、Agent任务、Skills都试了一遍&#xff0c;又在真实的Jav…

作者头像 李华
网站建设 2026/10/13 13:02:30

Spring Boot过滤器实战:定义、注册、执行顺序与常见坑

过滤器&#xff08;Filter&#xff09;是Servlet规范里最“老派”却又实用的组件&#xff0c;但Spring Boot项目里真正会用的人比想象中少。我日常帮同事review代码时&#xff0c;最常见的反应是&#xff1a;要么把Filter当作Spring MVC拦截器用&#xff0c;要么干脆用拦截器绕…

作者头像 李华
网站建设 2026/10/13 13:02:17

禅道部署与权限配置实战指南:从系统在线到语义在线

简介&#xff1a;本资源是面向项目管理初学者与中小型研发团队的《禅道使用手册&#xff08;完整版&#xff09;》&#xff0c;系统覆盖禅道项目管理工具的核心功能与实操路径&#xff0c;重点解决项目协作低效、需求跟踪混乱、Bug闭环不及时等典型痛点。手册内容结构清晰&…

作者头像 李华
网站建设 2026/10/13 13:02:04

LVM生产实战:7类高危操作的原理、风险与安全执行链路

1. 这不是教科书里的“逻辑卷”&#xff0c;而是我亲手在生产环境里反复拆装过的LVM实战手册你点开这个标题&#xff0c;大概率正被三件事困扰&#xff1a;一是刚学完LVM概念&#xff0c;一上手就卡在lvextend报错“not enough free space”&#xff1b;二是运维同事甩来一句“…

作者头像 李华
网站建设 2026/10/13 13:00:33

小波阈值去噪的MATLAB实现:软/硬阈值与5种改进规则

简介&#xff1a;面向需要做信号去噪的 MATLAB 用户&#xff0c;这份小波阈值函数包将 wden、thselect、wthresh 等原生函数改造后统一封装为 filterWaveletTh&#xff0c;一行代码即可切换软阈值、硬阈值及 5 种改进阈值规则&#xff0c;适用于振动分析、故障诊断、语音/传感器…

作者头像 李华
网站建设 2026/10/13 13:00:27

团队聚会限时模拟题详解:区间合并与时间转换实战

说实话&#xff0c;打开“团队聚会”这道限时大模拟题的那一刻&#xff0c;我是有点懵的。题面里密密麻麻全是类似“2020-01-01 08:00”的时间字符串&#xff0c;每个人后面跟着好几个时间段&#xff0c;最后还要你输出一个具体的“某年某月某日某时某分”&#xff0c;看起来就…

作者头像 李华