基于S函数的BP神经网络PID控制器及simulink仿真

文章目录

  • 文章来源和摘要
  • S函数的编写格式和运行步骤
  • simulink模型结构
  • S函数模型初始化部分代码理解
  • S函数模型更新部分
  • S函数模型输出部分
  • S函数完整代码附录

文章来源和摘要

S函数的编写格式和运行步骤

S函数相当于simulink中自定义的软件包,当simulink中没有现成的功能模块可用时,就可以通过编写s函数的方式来进行仿真。
S函数的编写格式为

各个变量对应的含义分别为

运行步骤:

simulink模型结构


在simulink中搭建模型如下

其中mux的作用是把常量合并成数组
demux(黑色部分)的作用是吧一个数组重新解析成标量
在这里有一个疑惑,就是输入的子系统中,并没有设置有效的单位延时

在BP神经网络+PID控制simulink仿真 - zkzfengyi的博客 - CSDN博客
这篇博客的评论区里,大家普遍认为有造假的嫌疑,我也十分困惑。

控制器部分,利用S函数实现BP神经网络的PID。论文给出的仿真效果如下

实际的控制器仿真效果如图

PID的输出参数变化

S函数模型初始化部分代码理解

S函数总共分为4个部分,第一部分为切换函数,第二部分为初始化,第三部分为数据更新部分,第四部分为模型输出。

% 模型初始化
function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates=0;%模块连续状态变量的个数sizes.NumDiscStates=3;%模块离散状态变量的个数sizes.NumOutputs=4;%模块输出变量的个数sizes.NumInputs=7;%模块输入变量的个数sizes.DirFeedthrough=1;%模块是否存在直接贯通,1表示存在直接贯通,若为0,则mdlOutputs函数里不能有usizes.NumSampleTimes=1;%模块的采样时间个数,至少是一个sys=simsizes(sizes);%设置完后赋给sys输出x0=zeros(3,1);%系统状态变量设置,3行一列str=[];ts=[0 0];%采样周期设为0表示是连续系统,
%     ts=[0.001 0];%采样周期设为0表示是连续系统,

simsizes是什么,帮助文档给出如下

ans =

包含以下字段的 struct:

NumContStates: 0
NumDiscStates: 0NumOutputs: 0NumInputs: 0
DirFeedthrough: 0
NumSampleTimes: 0

说明是一个系统的默认变量,不需要初始化就能直接引用。

S函数模型更新部分

% 模型更新部分,输入为系统状态量和系统输入
function sys=mdlUpdates(x,u)T=0.001;x=[u(5);x(2)+u(5)*T;(u(5)-u(4))/T];%3个状态量(偏差、偏差和以及偏差变化量),u(5)是偏差,u(4)是上一次的偏差,x(2)则是之前的偏差和sys=[x(1);x(2);x(3)];

x和u分别是什么?

u应该就是mux左侧的那7个输入变量,实际对应u(1)~u(7)

在这之前,初始化的时候,x0=zero(3,1)=[0;0;0],这里的x正式成为状态量,分别为偏差,偏差和,偏差变化量。

所以模型更新部分实际只更新了状态量。

S函数模型输出部分

参数的初始化

% 这一段基本上都是一些参数的初始化
xite=0.2;   % 学习速率
alfa=0.05;  % 惯性因子
IN=3;H=5;OUT=3; % 神经网络的3-5-3架构% 输入层-隐含层的加权系数
wi=rand(5,3);%产生一个5*3的随机数矩阵,随机数在(0,1)区间
wi_1=wi;wi_2=wi;wi_3=wi;    % 隐含层加权系数
% 隐含层-输出层的加权系数
wo=rand(3,5);
wo_1=wo;wo_2=wo;wo_3=wo;    % 输出层加权系数
Oh=zeros(5,1);  %产生一个1*5的零矩阵(行矩阵),这里就是隐含层
I=Oh;
% 输入层的具体输入
xi=[u(1),u(3),u(5)];%神经网络训练的3个输入,期望值、误差以及实际值
% PID的3个对应参量
epid=[x(1);x(2);x(3)];%3个状态变量(偏差、偏差和、偏差变化量)(3*1矩阵,列向量)
I=xi*wi';%隐层的输入

接着进行隐含层节点和输出层节点值的更新

% 更新隐含层
for j=1:1:5
% 隐含层的节点值
Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%隐层的输出值(1*5矩阵)行矩阵
end
% 更新输出层
K1=wo*Oh;   % 输出层的输入值(3*1矩阵)
for i=1:1:3
% 输出层的输出值
K(i)=exp(K1(i))/(exp(K1(i))+exp(-K1(i)));%得到输出层的输出(KP、KI、KD)(1*3矩阵,行向量)
end
% 这里得到的K相当于是pid的3个参数% 最终控制器的完全输出值
u_k=K*epid;%计算得到控制律u,1个值

最后,根据反向传播算法进行权值的调整

 %隐含层至输出层的权值调整dyu=sign((u(3)-u(2))/(u(7)-u(6)+0.0001));for j=1:1:3dK(j)=2/(exp(K1(j))+exp(-K1(j)))^2; %输出层的输出的一阶导endfor i=1:1:3delta3(i)=u(5)*dyu*epid(i)*dK(i);  %输出层的deltaendfor j=1:1:3for i=1:1:5d_wo=xite*delta3(j)*Oh(i)+alfa*(wo_1-wo_2);endend% 隐含层-输出层的加权系数的调整wo=wo_1+d_wo;%以下是输入层至隐含层的权值调整
for i=1:1:5
dO(i)=4/(exp(I(i))+exp(-I(i)))^2;%(1*5矩阵)
end
segma=delta3*wo;%(1*5矩阵,行向量)
delta2 = dO.*segma;
d_wi = delta2'*xi+alfa*(wi_1-wi_2);
% 输入层-隐含层的加权系数调整
wi=wi_1+d_wi;% 这里猜测存储的是历史信息?
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];

S函数完整代码附录

% 有个疑惑,到底是什么在选择flag?为什么这里没有主函数?
function [sys,x0,str,ts]=my_exppidf(t,x,u,flag)
switch flag,case 0,[sys,x0,str,ts]=mdlInitializeSizes;case 2,sys=mdlUpdates(x,u);case 3,sys=mdlOutputs(t,x,u);case {1,4,9},sys=[];otherwiseerror(['unhandled flag=',num2str(flag)]);%异常处理
end% 模型初始化
function[sys,x0,str,ts]=mdlInitializeSizessizes=simsizes;%用于设置模块参数的结构体用simsizes来生成sizes.NumContStates=0;%模块连续状态变量的个数sizes.NumDiscStates=3;%模块离散状态变量的个数sizes.NumOutputs=4;%模块输出变量的个数sizes.NumInputs=7;%模块输入变量的个数sizes.DirFeedthrough=1;%模块是否存在直接贯通,1表示存在直接贯通,若为0,则mdlOutputs函数里不能有usizes.NumSampleTimes=1;%模块的采样时间个数,至少是一个sys=simsizes(sizes);%设置完后赋给sys输出x0=zeros(3,1);%系统状态变量设置str=[];ts=[0 0];%采样周期设为0表示是连续系统,
%     ts=[0.001 0];%采样周期设为0表示是连续系统,
function sys=mdlUpdates(x,u)T=0.001;x=[u(5);x(2)+u(5)*T;(u(5)-u(4))/T];%3个状态量(偏差、偏差和以及偏差变化量),u(5)是偏差,u(4)是上一次的偏差,x(2)则是之前的偏差和sys=[x(1);x(2);x(3)];
function sys=mdlOutputs(t,x,u)xite=0.2;alfa=0.05;IN=3;H=5;OUT=3;wi=rand(5,3);%产生一个5*3的随机数矩阵,随机数在(0,1)区间wi_1=wi;wi_2=wi;wi_3=wi;wo=rand(3,5);wo_1=wo;wo_2=wo;wo_3=wo;Oh=zeros(5,1);%产生一个1*5的零矩阵(行矩阵)I=Oh;xi=[u(1),u(3),u(5)];%神经网络训练的3个输入,期望值、误差以及实际值epid=[x(1);x(2);x(3)];%3个状态变量(偏差、偏差和、偏差变化量)(3*1矩阵,列向量)I=xi*wi';%隐层的输入for j=1:1:5Oh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%隐层的输出值(1*5矩阵)行矩阵endK1=wo*Oh;%输出层的输入(3*1矩阵)for i=1:1:3K(i)=exp(K1(i))/(exp(K1(i))+exp(-K1(i)));%得到输出层的输出(KP、KI、KD)(1*3矩阵,行向量)endu_k=K*epid;%计算得到控制律u,1个值%%以下是权值调整%隐含层至输出层的权值调整dyu=sign((u(3)-u(2))/(u(7)-u(6)+0.0001));for j=1:1:3dK(j)=2/(exp(K1(j))+exp(-K1(j)))^2; %输出层的输出的一阶导endfor i=1:1:3delta3(i)=u(5)*dyu*epid(i)*dK(i);  %输出层的deltaendfor j=1:1:3for i=1:1:5d_wo=xite*delta3(j)*Oh(i)+alfa*(wo_1-wo_2);endendwo=wo_1+d_wo;%以下是输入层至隐含层的权值调整for i=1:1:5dO(i)=4/(exp(I(i))+exp(-I(i)))^2;%(1*5矩阵)endsegma=delta3*wo;%(1*5矩阵,行向量)delta2 = dO.*segma;d_wi = delta2'*xi+alfa*(wi_1-wi_2);wi=wi_1+d_wi;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];

完整simulink模型(建议使用MATLAB2016b或更高版本)+S函数工程文件+原论文和思维导图xmind下载:
基于S函数的BP神经网络PID控制器及Simulink仿真和对应代码模型.zip

压缩包截图

基于S函数的BP神经网络PID控制器及simulink仿真相关推荐

  1. 神经网络pid控制器MATLAB,BP神经网络PID控制器的Simulink 仿真模型搭建教程

    BP网络在人工神经网络中应用最为广泛,文中给出基于MATLAB语言的BP神经网络PID控制器的S函数实现,在此基础上建立BP神经网络PID控制器的Simulink 仿真模型,最后给出了该仿真模型应用在 ...

  2. 【遗传优化BP网络】基于自适应遗传算法的BP神经网络的股票预测MATLAB仿真

    1.软件版本 MATLAB2021a 2.本算法理论知识 通过MATLAB对BP神经网络,基于遗传优化的BP神经网络,基于改进遗传优化的BP神经网络以及基于改进遗传优化的组合BP神经网络等多种算法的股 ...

  3. bp神经网络pid控制_文章推荐 | BP神经网络PID控制器在无人机编队飞行中的应用...

    中文摘要: 无人机编队飞行可以大幅提高作战效率,因而受到了越来越多的关注.从近距离编队出发,采用长机-僚机编队结构,设计一种基于BP神经网络参数整定的PID控制器,并以双机菱形编队为基础,对其进行仿真 ...

  4. PID控制器算法-Simulink仿真

    PID控制算法 概述 上图是一个闭环控制系统地框图: 假设是调试一个电机的速度,上图的r(t)是目标速度,y(t)是速度输出量,e(t)是速度误差,u(t)是PID计算后发送给电机的输出值,被控对象是 ...

  5. PID控制器——MATLAB/Simulink仿真以及性能比较与分析

       本文主要内容:PID控制器,MATLAB/Simu link仿真模型的搭建.介绍以及各控制器性能的比较与分析.  一.本文中用到的Simulink模块    1. 传递环数模块 (Transfe ...

  6. 基于bp神经网络的pid算法,神经网络pid控制器设计

    基于BP神经网络的PID控制器设计 参考一下刘金琨的<先进PID控制>这本书. 例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)其中a ...

  7. 神经网络pid控制器MATLAB,基于BP神经网络的PID控制器及其MATLAB仿真.pdf

    基于BP神经网络的PID控制器及其MATLAB仿真.pdf 2009 NO.10 中国新技术新产品 China New Technologies and Products 高新技术 基于BP 神经网络 ...

  8. 【PID优化】基于matlab粒子群算法优化BP神经网络PID控制【含Matlab源码 2022期】

    ⛄一.粒子群算法优化BP神经网络PID控制简介 BP神经网络PID控制算法 传统PID控制器作为一种线性控制器,具备结构,容易实现的优点,其基本原理是将系统的实际输出值和期望输出值之间的偏差按照比例. ...

  9. bp 神经网络 优点 不足_【学术论文】基于灰度共生矩阵和BP神经网络的乳腺肿瘤识别...

    摘要 乳腺肿瘤是女性病发率极高的一种肿瘤疾病, 但也是一种可以通过早期确诊.提早治疗来降低病死率的一种疾病.提出灰度共生矩阵结合BP神经网络的方法, 提高乳腺肿瘤的识别率.首先将红外乳腺图像进行预处理 ...

最新文章

  1. 妙用postman系列——postman建组、分享
  2. 零基础怎么学习Java?
  3. win7仿linux主题,linuxmint 16 cinnamon模仿win7/win8主题
  4. c# vscode 配置_使用VSCode开发C#项目
  5. cxf客户端访问方式
  6. linux踩内存内存越界,Linux如何调试内存泄漏?超牛干货奉献给你(代码全)
  7. vs编译应用程序不依赖运行vs环境
  8. python日期函数_python 时间相关函数
  9. 三维空间两直线/线段最短距离、线段计算算法 【转】
  10. ASP.NET 3.5中的ListView控件和DataPager控件(一)
  11. 微星主板黑苹果_11.11黑苹果主机金牌装机单(AMD篇)
  12. 数据治理之数据发现-元数据-DataHub
  13. [机器学习入门] 经典台大李宏毅机器学习课程从这里开始
  14. 描述 J2EE 框架的多层结构,并简要说明各层的作用。
  15. java 繁体转简体_如何用java将繁体字转为简体字
  16. Oracle导出数据中的prompt,set feedback 等是什么意思
  17. Go关键字--chan
  18. 玩客云刷Armbian详细教程
  19. 详解 Android 系统启动流程
  20. 神经网络有哪些基本功能,常见的神经网络有哪些

热门文章

  1. 昨天做的事情和今天需要做的事情
  2. oe_runmake failed
  3. OpenCV_复制一个或多个ROI图像区域
  4. 红旗系统 oracle,红旗linux的Asianux 3.0安装oracle10.2
  5. 14年macmini装双硬盘_19年性价比超高的5款笔记本电脑推荐
  6. stmcubemx 脉冲计数_STM32CubeMX:ETR外部脉冲计数器
  7. pcie usb3.0 驱动 for linux_Linux 中的虚拟网络
  8. python爬虫requests简单案例_python网络爬虫(三)requests库的13个控制访问参数及简单案例...
  9. python3廖雪峰云-python3基础教程廖雪峰云_Python GUI库大汇总
  10. java中常用的包 类和接口_java.util包常用的类和接口