基于BP神经网络PID控制+Simulink仿真

基于BP神经网络PID控制+Simulink仿真最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。利用BP神经网络可以建立参数Kp,Ki,Kd自整定的PID控制器。基于BP神经网络的PID控制系统结构框图如下图所示:控制器由两部分组成:经典增量式PID控制器;BP神经网络…

大家好,又见面了,我是你们的朋友全栈君。

    最近在学习电机的智能控制,上周学习了基于单神经元的PID控制,这周研究基于BP神经网络的PID控制。

    神经网络具有任意非线性表达能力,可以通过对系统性能的学习来实现具有最佳组合的PID控制。利用BP神经网络可以建立参数Kp,Ki,Kd自整定的PID控制器。基于BP神经网络的PID控制系统结构框图如下图所示:

基于BP神经网络PID控制+Simulink仿真

    控制器由两部分组成:经典增量式PID控制器;BP神经网络

    经典增量式PID控制器

    

基于BP神经网络PID控制+Simulink仿真

    BP神经网络控制算法

    BP神经网络结构如下图所示:

基于BP神经网络PID控制+Simulink仿真

    它是一种有隐含层的3层前馈网络,包括输入层、隐含层和输出层。输出层的三个输出分别对应PID控制器的三个可调参数Kp、Ki和Kd。由于Kp、Ki和Kd不能为负,所以输出层神经元的变换函数取非负的Sigmoid函数,而隐含层神经元的变换函数可取正负对称的Sigmoid函数。

    BP神经网络的输入(M为输入变量的个数):

基于BP神经网络PID控制+Simulink仿真

    隐含层的输入输出为:

基于BP神经网络PID控制+Simulink仿真

基于BP神经网络PID控制+Simulink仿真

    输出层的输入输出:

基于BP神经网络PID控制+Simulink仿真

     采用以输出误差二次方为性能指标,其性能指标函数为:

基于BP神经网络PID控制+Simulink仿真

    按照梯度下降法修正网络的加权系数,并附加一使搜索快速收敛全局极小的惯性项,则有BP神经网络输出层的加权系数修正公式为:

基于BP神经网络PID控制+Simulink仿真

    同理,可得隐含层加权系数的计算公式为:

基于BP神经网络PID控制+Simulink仿真

基于BP神经网络PID控制+Simulink仿真

    由此,BP神经网络PID控制算法可总结为:

    (1)确定BP神经网络结构,即确定输入层和隐含层的节点个数,选取各层加权系数的初值wij(0)、wli(0),选定学习速率和惯性系数,此时k=1

    (2)采样给定和反馈信号,即r(k)和y(k),计算误差e(k)=r(k)-y(k)

    (3)确定输入量

    (4)根据上述公式,计算各层神经元的输入、输出,神经网络输出层即为PID控制器的三个可调参数Kp、Ki和Kd

    (5)由增量式PID控制公式,计算PID控制器的控制输出u(k)

    (6)进行神经网络学习,实时自动调整输出层和隐含层的加权系数wli(k)和wij(k),实现PID控制参数的自适应调整

    (7)置k=k+1,返回步骤(2)

    Matlab Simulink仿真建模

基于BP神经网络PID控制+Simulink仿真

    输入为阶跃信号,其参数为默认值,一个简单的闭环控制系统。BP神经网络PID控制器的内部结构如下图所示:

基于BP神经网络PID控制+Simulink仿真

    S-function的输入为:u=[e(k);e(k-1);e(k-2);y(k);y(k-1);r(k);u(k-1);隐含层+输出层权值系数(k-2);隐含层+输出层权值系数(k-1)]=

[u(1);u(2);u(3);u(4);u(5);u(6);u(7);…u(隐含层权值个数+输出层权值个数)],把所有的权值系数从输出再返回到输入是为了更新权值矩阵,从而自适应的调整PID三个参数。关于S-function的使用方法,请参考我写的另一篇博客:           https://blog.csdn.net/weixin_42650162/article/details/90488610

    S-function函数

    下面是S-function函数编写的控制算法:

    为了更好的理解下面的程序代码,先要理解Matlab中的几个函数

基于BP神经网络PID控制+Simulink仿真

    通过(:)把一个矩阵变为一个列向量

基于BP神经网络PID控制+Simulink仿真

    通过reshape函数,从列向量里任意组成矩阵如c=reshape(b,3,8),b中元素按顺序排成一个3*8的矩阵,也就是还原了矩阵a,

    c=reshape(b(10:24),3,5),b中第10个元素到第24个元素,按顺序排成一个3*5的矩阵。

    在我编写的S-function函数中,就是通过reshape函数,把输入的隐含层+输出层的列权值系数还原成:隐含层权值系数矩阵+输出层权值系数矩阵,通过算法完成这两个权值系数矩阵的更新。

    下面是M文件编写的S-function控制算法:

function [sys,x0,str,ts,simStateCompliance] = nnbp(t,x,u,flag,T,nh,xite,alfa)
switch flag,
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(T,nh);
%初始化函数
  case 3,
    sys=mdlOutputs(t,x,u,nh,xite,alfa);
%输出函数
  case {1,2,4,9},
    sys=[];
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(T,nh)
%调用初始画函数,两个外部输入参数 参数T确定采样时间,参数nh确定隐含层层数
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 4+6*nh;
%定义输出变量,包括控制变量u,三个PID参数:Kp,Ki,Kd,隐含层+输出层所有加权系数
sizes.NumInputs      = 7+12*nh;
%定义输入变量,包括前7个参数[e(k);e(k-1);e(k-2);y(k);y(k-1);r(k);u(k-1)]
%隐含层+输出层权值系数(k-2),隐含层+输出层权值系数(k-1)
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1; 
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [T 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlOutputs(t,x,u,nh,xite,alfa)
%调用输出函数
wi_2 = reshape(u(8:7+3*nh),nh,3);
%隐含层(k-2)权值系数矩阵,维数nh*3
wo_2 = reshape(u(8+3*nh:7+6*nh),3,nh);
%输出层(k-2)权值系数矩阵,维数3*nh
wi_1 = reshape(u(8+6*nh:7+9*nh),nh,3);
%隐含层(k-1)权值系数矩阵,维数nh*3
wo_1 = reshape(u(8+9*nh:7+12*nh),3,nh);
%输出层(k-1)权值系数矩阵,维数3*nh
xi = [u(6),u(4),u(1)];
%神经网络的输入xi=[u(6),u(4),u(1)]=[r(k),y(k),e(k)]
xx = [u(1)-u(2);u(1);u(1)+u(3)-2*u(2)];
%xx=[u(1)-u(2);u(1);u(1)+u(3)-2*u(2)]=[e(k)-e(k-1);e(k);e(k)+e(k-2)-2*e(k-1)]
I = xi*wi_1';
%计算隐含层的输入,I=神经网络的输入*隐含层权值系数矩阵的转置wi_1',结果为:
%I=[net0(k),net1(k)...netnh(k)]为1*nh矩阵
Oh = exp(I)./(exp(I)+exp(-I));
%激活函数,可更改
%计算隐含层的输出,(exp(I)-exp(-I))./(exp(I)+exp(-I))为隐含层的激活函数Sigmoid
%Oh=[o0(k),o1(k)...onh(k)],为1*nh的矩阵
O = wo_1*Oh';
%计算输出层的输入,维数3*1
K = 2./(exp(O)+exp(-O)).^2;
%激活函数,可更改
%计算输出层的输出K=[Kp,Ki,Kd],维数为1*3
%exp(Oh)./(exp(Oh)+exp(-Oh))为输出层的激活函数Sigmoid
uu = u(7)+K'*xx;
%根据增量式PID控制算法计算控制变量u(k)
dyu = sign((u(4)-u(5))/(uu-u(7)+0.0000001));
%计算输出层加权系数修正公式的sgn
%sign((y(k)-y(k-1))/(u(k)-u(k-1)+0.0000001)近似代表偏导
dK = 2./(exp(K)+exp(-K)).^2;
%激活函数,可更改
delta3 = u(1)*dyu*xx.*dK;
wo = wo_1+xite*delta3*Oh+alfa*(wo_1-wo_2);
%输出层加权系数矩阵的修正
dOh = 2./(exp(Oh)+exp(-Oh)).^2;
%激活函数,可更改
wi = wi_1+xite*(dOh.*(delta3'*wo))'*xi+alfa*(wi_1-wi_2);
%隐含层加权系数修正
sys = [uu;K(:);wi(:);wo(:)];
%输出层输出sys=[uu;K(:);wi(:);wo(:)]=
%[uu;Kp;Ki;Kd;隐含层+输出层所有权值系数]
%K(:),wi(:),wo(:),把这三个矩阵按顺序排为列向量

    本函数有四个外部输入变量:T,nh,xite,alfa T输入采样时间,nh确定隐含层层数,xite和alfa权值系数修正公式里的学习速率和惯性系数。

    为了更好地分配S-function的输出,需要对Demux进行如下设置:

基于BP神经网络PID控制+Simulink仿真

    确保前三个输出变量为:控制变量u,Kp,Ki,Kd,剩下的变量为隐含层权值系数矩阵+输出层权值系数矩阵总数之和。

    然后对此S-function函数进行封装:

具体过程可以参考我的另一篇博客:

    https://blog.csdn.net/weixin_42650162/article/details/90488610

    

基于BP神经网络PID控制+Simulink仿真

基于BP神经网络PID控制+Simulink仿真

    完成后点击S-function函数,会弹出外部参数设置框,设置参数如下:

基于BP神经网络PID控制+Simulink仿真

    注:T采样时间要和设置的控制算法的采样时间一样,不然会报错,如下:

基于BP神经网络PID控制+Simulink仿真

    下面是仿真结果:

基于BP神经网络PID控制+Simulink仿真

    Kp、Ki、Kd的自适应变化曲线:

    Kp:

基于BP神经网络PID控制+Simulink仿真

    Ki:

基于BP神经网络PID控制+Simulink仿真

    Kd:

基于BP神经网络PID控制+Simulink仿真

    有关仿真的所有资源已上传,如有需要可自行下载:

    https://download.csdn.net/download/weixin_42650162/11216367

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138789.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C# 连接本地数据库

    C# 连接本地数据库C#VSCodeM1C#如何连接本地数据库?1.安装MySQL下载MySQL软件,傻瓜式安装即可,安装完之后,在系统偏好号设置里会出现一个MySQL的图标。在安装的时候会让用户输入密码,这个自己看着输就行了,但是别忘记了。建议别用终端命令行安装了,对初学者来说学习成本比较大。2.连接本地MySQL安装完MySQL之后,点击MySQL图标,开启MySQL,如下我已开启我本地已安装了Navicate,我就使用Navicate对本地数据库进行连接,验证是否能连接成功打开Nvi.

    2022年5月31日
    40
  • HDU 2008 数字统计

    HDU 2008 数字统计

    2022年1月11日
    69
  • Mybatis中传递多个参数的4种方法总结[通俗易懂]

    Mybatis中传递多个参数的4种方法总结[通俗易懂]方法1:顺序传参法#{}里面的数字代表你传入参数的顺序。这种方法不建议使用,sql层表达不直观,且一旦顺序调整容易出错。方法2:@Param注解传参法#{}里面的名称对应的是注解 @Param括号里面修饰的名称。这种方法在参数不多的情况还是比较直观的,推荐使用。方法3:Map传参法#{}里面的名称对应的是 Map里面的key名称。这种方法适合传递多个参数…

    2022年6月13日
    41
  • java读取xml(当xml放在包里时)

    java读取xml(当xml放在包里时)

    2021年9月2日
    52
  • 如何更好的使用谷歌搜索引擎加速器_国外搜索引擎

    如何更好的使用谷歌搜索引擎加速器_国外搜索引擎搜索引擎命令大全!1、双引号把搜索词放在双引号中,代表完全匹配搜索,也就是说搜索结果返回的页面包含双引号中出现的所有的词,连顺序也必须完全匹配。bd和Google都支持这个指令。例如搜索:“seo方法图片”2、减号减号代表搜索不包含减号后面的词的页面。使用这个指令时减号前面必须是空格,减号后面没有空格,紧跟着需要排除的词。Google和bd都支持这个指令。例如:搜索-引擎返回的则是包含“搜索”这个词,却不包含“引擎”这个词的结果3、星号星号*是常用的通配符,也可以用在搜索中。百

    2025年10月22日
    2
  • “idea激活码永久”【2021最新】

    (“idea激活码永久”)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsa…

    2022年3月26日
    100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号