改进神经网络ADRC控制永磁同步电机的仿真研究及与传统二阶自抗扰控制的对比
最近在折腾永磁同步电机的控制策略,试了把传统ADRC和神经网络ADRC混搭着玩,发现这改进版的神经网络自抗扰控制有点东西。特别是注释里写满了各种调试时踩的坑,比如"千万别在此时刻初始化权值"、"这个参数要跟着采样时间走"之类的血泪经验,比看论文实用多了。配套的仿真文件里加了参数整定的小工具,可以直接拖拽调节参数看效果,比命令行调参直观多了。注意看dW1的计算里用到了sigmoid函数的导数,这相当
改进神经网络ADRC控制的永磁同步电机 仿真搭建了改进神经网络自适应的控制模块,对永磁同步电机进行闭环控制。 控制策略由代码程序实现。 另外基于这个永磁同步电机模型搭建了传统的二阶自抗扰控制模块,并对这两种控制进行对比。 仿真结果显示,改进神经网络自适应控制在响应速度和抗干扰性都更具有优势,具有研究价值。 文件包括: [1]仿真模型 [2]程序代码 [3]相关参考文献 注:程序代码注释详细,非常适合需要学习这方面的同学参考。

最近在折腾永磁同步电机的控制策略,试了把传统ADRC和神经网络ADRC混搭着玩,发现这改进版的神经网络自抗扰控制有点东西。尤其是手头有个被各种负载突变折磨的电机模型,这货的表现竟然比传统方案稳得多。今天就带大家看看这控制策略怎么落地,顺便拆解代码里几个关键操作。

先说下控制架构的核心思路。传统二阶ADRC那套扩张状态观测器(ESO)大家应该都熟,但参数整定这事儿真能逼疯强迫症。我们的改进方案在ESO后面挂了个单隐层神经网络,实时在线调整控制量补偿。举个栗子,在电机转速突变时,这个网络就像个经验老道的司机,能预判负载扰动提前打方向盘。

来看代码里这个神经网络的自适应部分:
def neural_compensator(z1, z2, e):
W1 = np.random.randn(2,5) # 输入层到隐层权重
W2 = np.random.randn(5,1) # 隐层到输出层权重
gamma = 0.2 # 学习率
# 前向计算
hidden_in = np.dot(np.array([z1, z2]), W1)
hidden_out = sigmoid(hidden_in)
u_nn = np.dot(hidden_out, W2)
# 权值调整律(关键!)
dW2 = gamma * e * hidden_out.T
dW1 = gamma * e * np.outer(np.array([z1,z2]), W2.T * sigmoid_deriv(hidden_in))
return u_nn, W1+dW1, W2+dW2
这段代码最骚的操作在于权值更新不是用传统的反向传播,而是结合了跟踪误差和ESO的观测状态。注意看dW1的计算里用到了sigmoid函数的导数,这相当于给补偿量加了动态约束,防止控制量突变把电机搞宕机。

对比传统ADRC的ESO实现,差距立现:
% 传统二阶ADRC的ESO实现
function [z1, z2] = eso(y, u)
global beta01 beta02 beta03 delta
e = z1 - y;
fe = fal(e, 0.5, delta);
fe1 = fal(e, 0.25, delta);
z1 = z1 + h*(z2 - beta01*e);
z2 = z2 + h*(z3 - beta02*fe + b*u);
z3 = z3 + h*(-beta03*fe1);
end
这经典的fal函数调参简直是门玄学,特别是当电机运行在低速区时,delta参数稍微抖一下就能让系统震荡。而神经网络的版本通过在线学习,在仿真中看到delta参数能自适应调整范围,从0.1到0.5自动漂移。

改进神经网络ADRC控制的永磁同步电机 仿真搭建了改进神经网络自适应的控制模块,对永磁同步电机进行闭环控制。 控制策略由代码程序实现。 另外基于这个永磁同步电机模型搭建了传统的二阶自抗扰控制模块,并对这两种控制进行对比。 仿真结果显示,改进神经网络自适应控制在响应速度和抗干扰性都更具有优势,具有研究价值。 文件包括: [1]仿真模型 [2]程序代码 [3]相关参考文献 注:程序代码注释详细,非常适合需要学习这方面的同学参考。

跑完仿真后的波形对比很有意思。突加负载时,传统ADRC的转速跌落有80rpm,恢复时间大约0.1s;而神经网络ADRC的跌落只有40rpm左右,0.06s就稳住了。更惊喜的是在5%参数失配的情况下(比如故意把定子电阻设错),改进版的超调量还能保持在3%以内。

不过这套方案也不是没有坑,最大的雷是神经网络的初始权值设置。一开始傻傻地用全零初始化,结果控制量根本学不动。后来改成He初始化配合泄漏项才解决,代码里那个np.random.randn现在看起来简单,当初可是试了七八种初始化方法才定的。

建议想复现的同学重点关注三个地方:1)ESO观测带宽与神经网络学习率的匹配 2)激励信号的设计 3)隐层节点数不要贪多(5-7个足够)。配套的仿真文件里加了参数整定的小工具,可以直接拖拽调节参数看效果,比命令行调参直观多了。
完整代码包已经打包好了,包括MATLAB和Python双版本实现。特别是注释里写满了各种调试时踩的坑,比如"千万别在此时刻初始化权值"、"这个参数要跟着采样时间走"之类的血泪经验,比看论文实用多了。需要的小伙伴直接戳项目地址自取,别忘了star哦~
更多推荐
所有评论(0)