改进神经网络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哦~

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐