BP神经网络PID控制器的设计与仿真

文章目录
  1. 1. 绪论
    1. 1.1. BP神经网络概述
    2. 1.2. BP神经网络算法学习步骤
    3. 1.3. BP神经网络的改进
  2. 2. BP神经网络PID控制器设计
    1. 2.1. BP神经网络PID控制器原理
    2. 2.2. BP神经网络PID控制器设计步骤
  3. 3. BP神经网络PID控制器仿真分析
    1. 3.1. 仿真模型搭建
    2. 3.2. S-function编写
    3. 3.3. 仿真结果分析
  4. 4. 参考资料

预习神经网络原理及应用课程大作业所整理的笔记。
本文将介绍BP神经网络PID控制器原理及其改进、Simlink仿真具体步骤。依照上述原理与方法完成基于BP神经网络的永磁同步电机PID控制器设计与仿真。

绪论

BP神经网络概述

误差反向传播(Back Propagation,BP)神经网络于1986年由Rumelhart和McClelland等人提出,其本质是一种对误差进行逆向传播,反复训练得到的多层前馈神经网络。BP神经网络一般由三层网络组成:输入层、隐含层与输出层。
BP神经网络算法有两个要点:其一是信息的前向传播,即信息经过输入层传播到隐含层后最终由输出层进行输出的过程。此时若实际输出与期望输出相同,则学习训练到此结束,给出结果;
其二是误差的反向传播,若实际输出与期望值不符,误差信号会原路返回,通过依次修改输出层和 隐含层的连接权使误差信号沿着负梯度方向下降,即调节权值使误差减小。
经过上述过程后,网络的最终实际输出将慢慢趋近于期望输出。

BP神经网络算法学习步骤

图1 BP神经网络模型

设输入层、隐含层、输出层节点分别为\(x_i,o_j,y_l \quad (i=1,2,\cdots,M \quad j=1,2,\cdots,Q \quad l=1,2,\cdots,L)\)
设输入层神经元\(i\)与隐含层神经元\(j\)的连接权值为\(w_{ji}\),设隐含层神经元\(j\)与输出层神经元\(l\)的连接权值为\(w_{lj}\)

(1)初始化:为每个神经元随机分配初始权值与阈值。
(2)前向传播:
计算隐含层节点的输出:\(o_j=f(\sum\limits_{i=0}^n w_{ji}x_i-\theta_j)=f(net_j)\)
计算输出层节点的输出:\(y_l=f(\sum\limits_{j=0}^n w_{lj}x_i-\theta_l)=f(net_l)\)
(3)计算误差:设输出端的教师信号为\(t_l \quad (l=1,2,\cdots,L)\),得到误差函数\(E_p=\frac{1}{2} \sum_l (t_l-y_l)^2\)
(4)反向传播:若误差函数满足要求,则结束训练;否则开始误差反向传递,即从后向前沿着误差梯度减小的方向修改每层之间的连接权值。
计算误差函数\(E_p\)与输出层节点连接权的偏导数:\(\frac{\partial E}{\partial w_{lj}}=\sum\limits_{k=1}^L \frac{\partial E}{\partial y_k} * \frac{\partial y_k}{\partial w_{lj}}=\frac{\partial E}{\partial y_l} * \frac{\partial y_l}{\partial w_{lj}}\)
\(\frac{\partial E}{\partial y_l}=\frac{1}{2}\sum_K[-2(t_k-y_k)] * \frac{\partial y_k}{\partial y_l}=-(t_l-y_l)\)
\(\frac{\partial y_l}{\partial w_{lj}}=\frac{\partial y_l}{\partial net_l} * \frac{\partial net_l}{\partial w_{lj}}=f'(net_l) * y_j\)
\(\Rightarrow \frac{\partial E}{\partial w_{lj}}=-(t_l-y_l) * f'(net_l) * y_j\)
计算误差函数\(E_p\)与隐含层节点连接权的偏导数:\(\frac{\partial E}{\partial w_{ji}}=\sum_i \sum_j \frac{\partial E}{\partial y_l} * \frac{\partial y_l}{\partial o_j} * \frac{\partial o_j}{\partial w_{ji}}\)
\(\frac{\partial y_l}{\partial o_j}=\frac{\partial y_l}{\partial net_l} * \frac{\partial net_l}{\partial o_j}=f'(net_l) * w_{ji}\)
\(\frac{\partial o_j}{\partial w_{ji}}=\frac{\partial o_j}{\partial net_j} * \frac{\partial net_j}{\partial w_{ji}}=f'(net_j) * x_i\)
\(\Rightarrow \frac{\partial E}{\partial w_{ji}} = -\sum_l (t_l-y_l) * f'(net_l) * w_{ji} * f'(net_j) * x_i\)
\(=-\sum_l \delta_l * w_{ji} * f'(net_j) * x_i = -\delta_j^{'} * x_i\)
其中\(\delta_l = (t_l-y_l) * f'(net_l) \quad \delta_j^{'}=f'(net_j)*\sum_l \delta_l w_{ji}\)
(5)调整连接权值:利用梯度下降原理,令连接权值按照学习速率\(\eta\)修正。
输出层节点的连接权值被更新为:\(w_{lj}(k+1)=w_{lj}(k)+\Delta w_{lj} = w_{lj}(k) + \eta \delta_l o_j\)
隐含层节点的连接权值被更新为:\(w_{ji}(k+1)=w_{ji}(k)+\Delta w_{ji} = w_{ji}(k) + \eta^{'} \delta_j^{'} x_i\)
(6)令\(k=k+1\),回到步骤(2)再次进行计算,直至误差函数\(E_p\)小于某个设定好的阈值,结束学习训练。

BP神经网络的改进

(1)引入惯性项
提升收敛速度,同时会获得更优异的动态特性。
(2)引入动量项
在修正时同时根据k时刻以及k-1时刻的梯度值来进行调整,使得网络能够更好的收敛。
(3)变步长因子
训练刚开始时,𝜂可以较大以增大收敛速度;当训练趋于稳定时,𝜂可以较小,以保持稳定。
(4)选取合适的激活函数
将激活函数变为ReLU等改进型非线性函数。解决梯度消失问题。

BP神经网络PID控制器设计

BP神经网络PID控制器原理

图2 BP神经网络PID控制器框图

PID控制的比例、积分、微分三个参数具有相互配合、相互制约的特点。借助BP网络对非线性函数的映射能力,可以使PID控制器中三个参数的各种非线性组合的最优解能够通过自学习得到。
BP神经网络PID控制器框图如上图所示,其中常规PID部分能够对受控对象形成闭环反馈控制,神经网络部分能够依据系统状态和特定的学习算法,最终得到最优的PID控制器的参数。

BP神经网络PID控制器设计步骤

图3 BP神经网络模型(PID控制器)

(1)确定BP神经网络的结构
本文应用于PID控制器的BP神经网络模型如上图所示,该模型采用3-5-3结构。
其中,输入层\(x_1,x_2,x_3\)分别是系统的期望值、偏差值与实际值。输出层是PID控制器的\(K_p,K_i,K_d\)参数。这里将隐含层神经元个数设为5。
(2)设定隐含层以及输出层的连接权的初始值
设输入层、隐含层、输出层节点分别为\(x_i,o_j,y_l \quad (i=1,2,3 \quad j=1,2,3,4,5 \quad l=1,2,3)\)
设输入层神经元\(i\)与隐含层神经元\(j\)的连接权值为\(w_{ji}\),设隐含层神经元\(j\)与输出层神经元\(l\)的连接权值为\(w_{lj}\)
(3)确定激活函数
根据系统控制实际需求,这里选择双曲正切函数作为隐含层的激活函数。
\(f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}\)
\(f^{'}(x)=1-tanh^2(x)=1-f^2(x)\)
由于输出层节点\(K_p,K_i,K_d\)值不能小于零,因此选择非负型双曲正切函数作为输出层的激活函数。
\(g(x)=\frac{1}{2}[1+tanh(x)]=\frac{e^x}{e^x+e^{-x}}\)
\(g^{'}(x)=2g(x)[1-g(x)]\)
(4)前向传播参数计算
根据当前时刻系统设定值\(r(k)\)与实际输出值\(y(k)\),依次计算\(e(k)\)、输入层输入、隐含层输入、隐含层输出、输出层输入、输出层输出。
注:右上角的\((1),(2),(3)\)用来指代输入层、隐含层、输出层。
输入层输入:\(o_i^{(1)}=x(j) \quad (i=1,2,3)\)
隐含层输入:\(net_j^{(2)}=\sum\limits_{i=0}^3 w_{ji}^{(2)} o_i^{(1)}\)
隐含层输出:\(o_j^{(2)}(k)=f(net_j^{(2)}(k)) \quad (j=1,2,3,4,5)\)
输出层输入:\(net_l^{(3)}(k)=\sum\limits_{j=0}^5 w_{lj}^{(3)} o_j^{(2)}(k)\)
输出层输出:\(o_l^{(3)}(k)=g(net_l^{(3)}(k)) \quad (l=1,2,3)\)
(5)根据增量式数字PID控制的公式,计算PID控制器输出的控制值u(k)
选定性能指标函数\(E(k)=\frac{1}{2}[r(k)-y(k)]^2\)
(6)反向传播参数计算
根据负梯度规则,调整输出层连接权值\(w_{lj}^{(3)}\)和隐含层连接权值\(w_{ji}^{(2)}\)
\(\Delta w_{lj}^{(3)}(k)=-\eta\frac{\partial E(k)}{\partial w_{lj}^{(3)}} + \alpha \Delta w_{lj}^{(3)}(k-1)\)
\(\frac{\partial E(k)}{\partial w_{lj}^{(3)}}=\frac{\partial E(k)}{\partial y(k)} * \frac{\partial y(k)}{\partial \Delta u(k)} * \frac{\partial \Delta u(k)}{\partial o_l^{(3)}(k)} * \frac{\partial o_l^{(3)}(k)}{\partial net_l^{(3)}(k)} * \frac{\partial net_l^{(3)}(k)}{\partial w_{lj}^{(3)}}\)
经过化简与近似,得到输出层的连接权值在学习后的改变量
\(\Delta w_{lj}^{(3)}(k)=\alpha \Delta w_{lj}^{(3)}(k-1) + \eta \delta_l^{(3)}o_j^{(2)}(k)\)
\(\delta_l^{(3)}=e(k)sgn(\frac{\partial y(k)}{\partial \Delta u(k)}) \frac{\Delta u(k)}{\partial o_l^{(3)}(k)}g^{'}(net_l^{(3)}(k))\)
同理得到隐含层的连接权值在学习后的改变量
\(\Delta w_{ji}^{(2)}(k)=\alpha \Delta w_{ji}^{(2)}(k-1)+\eta \delta_j^{(2)}o_i^{(1)}(k)\)
\(\delta_j^{(2)}=f^{'}(net_j^{(2)}(k))\sum\limits_{l=1}^3 \delta_l^{(3)}w_{lj}^{(3)}(k)\)
(7)令\(k=k+1\),回到步骤(4)再次进行计算,直至性能指标函数\(E(k)\)小于设定值,结束学习训练。

BP神经网络PID控制器仿真分析

仿真模型搭建

在双闭环PI控制的PMSM控制基础上,引入BP神经网络算法,对转速环的PID参数进行实时优化。其控制系统原理图如下所示:
图4 基于BP神经网络的PMSM控制系统原理图
根据控制系统原理图,搭建如下图所示的控制系统仿真模型:
图5 基于BP神经网络的PMSM控制系统仿真模型
PMSM的数学模型参见鲁棒控制理论与应用02-H∞控制器的设计方法,本文沿用了上述数学模型,这里不再赘述。
电机参数、电流环PI控制器参数、Simulink仿真参数,以及PMSM控制系统原理图介绍参见基于粒子群算法的电机控制器参数整定研究,本文沿用了上述参数,这里不再赘述。
图6 BP神经网络PID控制器仿真模型
基于BP神经网络的PID控制器仿真模型如上图所示。
由图可知,控制器的输入量为给定值、误差值和实际值,这三个输入量与控制器输出量经过如下图所示的延时环节处理后得到给定值、上一时刻与当前时刻的实际值、上一时刻与当前时刻的误差值以及上一时刻与当前时刻的控制器输出量,这7个值作为输入量导入到基于BP神经网络算法的PID控制器S函数程序之中,其输出为控制器输出量和当前时刻的三个PID参数。
图7 输入量处理

S-function编写

S函数模块的导入外部参数与封装的步骤可以参考单神经元PID控制器的设计与仿真
注:“模块参数”界面中“S-Function参数”填写的内容是在K0,T,xite,alfa
注:本次仿真采用的外部参数取值K0=60,T=0.0002,xite=0.002,alfa=0.0005

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
function [sys,x0,str,ts,simStateCompliance] = s_bppid(t,x,u,flag,K0,T,xite,alfa)
%x0状态变量初始值,ts采样时间
%x状态变量,u输入向量,flag标志位,K0、T、xite、alfa外部参数
%输入向量对应仿真文件中S函数模块与左侧Mux总线相连的7个输入值
%它们在S函数程序中被表示为u(1),u(2),u(3),u(4),u(5),u(6),u(7)
switch flag
case 0
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;%初始化函数
case 2
sys=mdlUpdate(t,x,u,K0,T);%状态变量更新函数
case 3
sys=mdlOutputs(t,x,u,xite,alfa);%输出与权值更新函数
case {1,4,9}
sys=[];
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;
sizes.NumDiscStates=3;%状态变量个数
sizes.NumOutputs=4;%输出参数格式(PID输出控制量、Kp、Ki、Kd)
sizes.NumInputs=7;%输入参数个数
sizes.DirFeedthrough=1;
sizes.NumSampleTimes=1;
sys=simsizes(sizes);
x0=[0.1,0.1,0.1];%状态变量初始值,设置为比较小不为零的正数
str=[];
ts=[0 0];
simStateCompliance = 'UnknownSimState';

function sys=mdlUpdate(t,x,u,K0,T)
x=[K0*u(5);x(2)+u(5)*T;(u(5)-u(4))/T];%e(k),e(k)求和,e(k)求微分
sys=[x(1);x(2);x(3)];

function sys=mdlOutputs(t,x,u,xite,alfa)

global wi;
global wo;
global wi_1;
global wi_2;
global wi_3;

global wo_1;
global wo_2;
global wo_3;

global Kp;
global Ki;
global Kd;

Oh=zeros(1,5);
I=Oh;
K1=zeros(3,1);K=zeros(1,3);dyu=0;dK=zeros(1,3);delta3=zeros(1,3);
d_wo=zeros(3,5);segma=zeros(1,5);delta2=zeros(1,5);d_wi=zeros(5,3);dO=zeros(1,5);

xi=[u(1),u(3),u(5)];%输入层的输入(设定值、实际值、误差)
epid=[x(1);x(2);x(3)];%用于传给pid控制器的状态变量

I=xi*wi';%隐含层的输入

for j=1:1:5
%解决I值过大时结果为NaN的问题
if I(j)>500
I(j)=500;
end
if I(j)<-500
I(j)=-500;
end
Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%隐含层的输出
end

K1=wo*Oh'; %输出层的输入

for i=1:1:3
K(i)=exp(K1(i))/(exp(K1(i))+exp(-K1(i)));%输出层的输出
end

u_k=K*epid;%PID控制量输出

%以下是权值调整

%隐含层至输出层的权值调整
dyu=sign((u(3)-u(2))/(u(7)-u(6)+0.0000001));
for j=1:1:3
dK(j)=2/(exp(K1(j))+exp(-K1(j)))^2; %输出层的输出的一阶导
end
for i=1:1:3
delta3(i)=u(5)*dyu*epid(i)*dK(i); %输出层的delta
end
for j=1:1:3
for i=1:1:5
d_wo=xite*delta3(j)*Oh(i)+alfa*(wo_1-wo_2);
end
end
wo=wo_1+d_wo+alfa*(wo_1-wo_2);
%以下是输入层至隐含层的权值调整
for i=1:1:5
dO(i)=4/(exp(I(i))+exp(-I(i)))^2;
end
segma=delta3*wo;
for i=1:1:5
delta2(i)=dO(i)*segma(i);
end

d_wi=xite*delta2'*xi;
wi=wi_1+d_wi+alfa*(wi_1-wi_2);

wo_3=wo_2;
wo_2=wo_1;
wo_1=wo;
wi_3=wi_2;
wi_2=wi_1;
wi_1=wi;

Kp=K(1);Ki=K(2);Kd=K(3);
sys=[u_k,Kp,Ki,Kd];

仿真结果分析

分别对采用PI控制的系统与采用基于BP神经网络的PID控制的系统进行仿真分析,设定为电机转速给定值\(\omega_r^*\)=1000r/min,使其空载起动,0.1秒后对电机施加12\(N \cdot m\)的负载转矩,仿真得到电机转速\(\omega_r\)波形,对其动态与静态性能进行对比分析。
双闭环PI控制系统与基于BP神经网络的PID控制系统起动和突加负载的转速比较曲线如下图所示。
图8 转速比较曲线

由转速比较曲线可以看出,在系统起动时,PI控制下的调节时间为21.57ms,超调量为4.42%,BP神经网络控制下的调节时间为12.37ms,超调量为1.27%;
突加负载扰动后,PI控制下的最大转速降落为40.18r/min,恢复时间为8.48ms,BP神经网络控制下的最大转速降落为22.86r/min,恢复时间为1.85ms。
PI控制系统与BP神经网络控制系统转速最终均稳定为给定值,稳态误差为0。
由转速响应曲线归纳出的数据表明,二者在稳态性能上均符合控制需求,在动态性能指标上,BP神经网络控制系统具有更短的调节时间与恢复时间,以及更小的超调量,这说明相较于PI控制系统,BP神经网络控制系统具有更好的快速性。

参考资料