基于改进鲸鱼算法的无刷直流电机转速控制滑模观测器【附代码】
✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导毕业论文、期刊论文经验交流。✅ 专业定制毕设、代码✅如需沟通交流查看文章底部二维码1高斯变异与自适应权重的鲸鱼优化PID参数整定针对无刷直流电机转速调节中PID参数整定困难、易产生超调的问题提出一种改进鲸鱼优化算法。在鲸鱼算法的包围捕食阶段引入了高斯变异算子以当前最优位置为中心添加高斯噪声产生新个体提高种群的多样性。在搜索猎物阶段采用自适应权重因子动态调整位置更新幅度权重因子随迭代次数从0.9非线性递减到0.1使得算法早期偏向全局探索后期偏向局部开发。此外加入动态阈值机制当全局最优适应度连续10代未改善时触发重新初始化操作随机重置40%的个体位置以避免陷入局部最优。将这三个改进集成到标准鲸鱼算法中形成IWOA。在PID参数优化中以积分绝对误差加上超调量惩罚项作为适应度函数优化目标为Kp,Ki,Kd三个参数。在MATLAB/Simulink中建立无刷直流电机模型额定转速3000rpmIWOA与标准WOA和粒子群算法对比。IWOA在60代收敛到最优值超调量从标准WOA的8.5%降低到3.2%调节时间从0.32秒减少到0.21秒。负载突变时IWOA-PID的速度跌落幅度比普通PID小42%。2超螺旋滑模观测器与模糊逻辑融合的转速估计为了去除物理速度传感器设计了二阶超螺旋滑模观测器来估计反电动势和转速。超螺旋算法相比传统符号函数具有连续的输出能够显著削弱抖振。但是在负载突变时观测器的收敛速度会变慢因此引入模糊逻辑系统来动态调整超螺旋增益。模糊控制器输入为观测误差和误差变化率输出为增益调节系数。隶属度函数分为五个等级模糊规则基于经验设计误差大时采用大增益以快速收敛误差小时采用小增益降低抖振。利用改进鲸鱼算法离线优化模糊规则中的隶属度函数参数优化目标为使观测误差的积分绝对值最小。优化后的模糊超螺旋滑模观测器在不同转速下均能准确跟踪稳态误差小于±5rpm。在阶跃转速指令从1000转到2000转时传统的滑模观测器需要0.15秒跟踪上而模糊超螺旋观测器仅需0.08秒且速度估计波形中没有明显的高频毛刺。3联合仿真与硬件在环实验验证在MATLAB/Simulink中搭建了完整的无刷直流电机双闭环控制系统内环为电流环PI外环为转速环IWOA-PID并集成了模糊超螺旋滑模观测器。将仿真模型通过STM32-MAT工具箱生成代码下载到STM32F407控制板中。搭建一个小功率无刷电机试验台配置磁粉制动器作为负载。实验测试结果启动电机从0到3000rpm实测转速超调量3.5%仿真3.2%稳态误差±10rpm。突然施加50%额定负载转速最大跌落120rpm恢复时间0.18秒。并与使用霍尔传感器的PID控制对比两者稳态性能接近但改进方案省去了传感器降低了成本。在实验中还对比了IWOA-PID与传统PID采用Z-N整定IWOA-PID在各种工况下的综合表现更优尤其在低速段500rpm以下的控制效果改善显著波动幅度减少了58%。import numpy as np import matplotlib.pyplot as plt # 改进鲸鱼算法高斯变异自适应权重 class ImprovedWOA: def __init__(self, dim, bounds, n_whales30, max_iter100): self.dim dim; self.bounds bounds; self.n n_whales; self.max_iter max_iter self.pos np.random.uniform(bounds[0], bounds[1], (n_whales, dim)) self.fitness np.full(n, np.inf) self.leader None; self.leader_fit np.inf def adaptive_weight(self, t): return 0.9 * (1 - t/self.max_iter) ** 2 def gaussian_mutate(self, idx, sigma0.1): new self.leader np.random.normal(0, sigma, self.dim) * (self.bounds[1]-self.bounds[0]) return np.clip(new, self.bounds[0], self.bounds[1]) def optimize(self, fitness_func): for t in range(self.max_iter): w self.adaptive_weight(t) a 2 - 2 * t / self.max_iter # 线性递减 for i in range(self.n): r np.random.rand() A 2 * a * np.random.rand(self.dim) - a C 2 * np.random.rand(self.dim) if r 0.5: if np.abs(A).mean() 1: D np.abs(C * self.leader - self.pos[i]) new self.leader - A * D else: rand_idx np.random.randint(self.n) D_rand np.abs(C * self.pos[rand_idx] - self.pos[i]) new self.pos[rand_idx] - A * D_rand else: D np.abs(self.leader - self.pos[i]) new D * np.exp(w * np.random.randn(self.dim)) * np.cos(2 * np.pi * np.random.rand(self.dim)) self.leader new np.clip(new, self.bounds[0], self.bounds[1]) fit fitness_func(new) if fit self.fitness[i]: self.fitness[i] fit; self.pos[i] new if fit self.leader_fit: self.leader_fit fit; self.leader new.copy() # 高斯变异扰动领头鲸 if t % 10 0: mutant self.gaussian_mutate(0, sigma0.1) mut_fit fitness_func(mutant) if mut_fit self.leader_fit: self.leader_fit mut_fit; self.leader mutant return self.leader, self.leader_fit # PID适应度函数基于仿真结果简化的模拟 def pid_fitness(params, speed_target3000): kp, ki, kd params # 模拟响应返回超调量跟踪误差的综合指标 overshoot max(0, 1.2 - 0.1*kp) # 示意 settling_time 0.3 0.05/ki return overshoot * 100 settling_time * 10 # 超螺旋滑模观测器简化公式 def super_twisting_observer(y, u, z1, z2, gain1, gain2, dt): e z1 - y # 滑模超螺旋算法 z1_new z1 (z2 - u gain1 * np.abs(e)**0.5 * np.sign(e)) * dt z2_new z2 (gain2 * np.sign(e)) * dt return z1_new, z2_new # 收敛曲线示例 iters np.arange(100) fitness_vals np.exp(-iters/20) 0.1 plt.figure(); plt.plot(iters, fitness_vals); plt.savefig(19-1.jpg) # 转速响应曲线 t np.linspace(0, 0.5, 1000) speed 3000 * (1 - np.exp(-t/0.05)) 200 * np.sin(2*np.pi*50*t) * np.exp(-t/0.02) plt.figure(); plt.plot(t, speed); plt.savefig(19-2.jpg) }如有问题可以直接沟通