基于S函数的RBF神经网络PID控制器.doc
文本预览下载声明
基于径向基函数的神经网络的PID控制器
摘要
RBF神经网络在分类问题中得到了广泛的应用,尤其是模式识别的问题。许多模式识别实验证明,RBF具有更有效的非线性逼近能力,并且RBF神经网络的学习速度较其他网络快。本文在具有复杂控制规律的S函数构造方法的基础上,给出了基于MATLAB语言的RBF神经网络PID控制器,及该模型的一非线性对象的仿真结果。
关键词:S函数;RBF神经网络PID控制器;Simulink仿真模型
径向基函数(RBF-Radial Basis Function)神经网络是由J.Moody和C.Darken在20世纪80年代末提出的一种神经网络,它具有单隐层的三层前馈网络。由于它模拟了人脑中局部调整、相互覆盖接受域(或称野-Receptive Field)的神经网络结构,因此,RBF神经网络是一种局部逼近网络,已证明它能以任意精度逼近任意连续函数。
S函数的编写方法
S函数是Simulink中的高级功能模块,Simulink是运行在MATLAB环境下用于建模、仿真和分析动态系统的软件包。只要所研究的系统模型能够由MATLAB语言加以描述,就可构造出相应的S函数,从而借助Simulink中的S函数功能模块实现MATLAB与Simulink之间的沟通与联系,这样处理可以充分发挥MATLAB编程灵活与Simulink简单直观的各自优势。当系统采用较复杂的控制规律时,Simulink中没有现成功能模块可用,通常都要采用MATLAB编程语言,编写大量复杂而繁琐的源程序代码进行仿真,一是编程复杂、工作量较大,二来也很不直观。如果能利用Simulink提供的S函数来实现这种控制规律,就可以避免原来直接采取编程的方法,不需要编写大量复杂而繁琐的源程序,编程快速、简捷,调试方便,则所要完成的系统仿真工作量会大大减少。
RBF神经网络PID控制器的核心部分的S函数为:
function [sys,x0,str,ts]=nnrbf_pid(t,x,u,flag,T,nn,K_pid,eta_pid,xite,alfa,beta0,w0)
switch flag,
case 0, [sys,x0,str,ts] = mdlInitializeSizes(T,nn);
case 2, sys = mdlUpdates(u);
case 3, sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,xite,alfa,beta0,w0);
case {1, 4, 9}, sys = [];
otherwise, error([Unhandled flag = ,num2str(flag)]);
end
function [sys,x0,str,ts] = mdlInitializeSizes(T,nn)
sizes = simsizes;
sizes.NumContStates = 0; sizes.NumDiscStates = 3;
sizes.NumOutputs = 4+5*nn; sizes.NumInputs = 9+15*nn;
sizes.DirFeedthrough = 1; sizes.NumSampleTimes = 1;
sys=simsizes(sizes); x0=zeros(3,1); str=[]; ts=[T 0];
function sys = mdlUpdates(u)
sys=[u(1)-u(2); u(1); u(1)+u(3)-2*u(2)];
function sys = mdlOutputs(t,x,u,T,nn,K_pid,eta_pid,xite,alfa,beta0,w0)
ci_3=reshape(u(7: 6+3*nn),3,nn); ci_2=reshape(u(7+5*nn: 6+8*nn),3,nn);
ci_1=reshape(u(7+10*nn: 6+13*nn),3,nn);
bi_3=u(7+3*nn: 6+4*nn); bi_2=u(7+8*nn: 6+9*nn);
bi_1=u(7+13*nn: 6+14*nn); w_3= u(7+4*nn: 6+5*nn);
w_2= u(7+9*nn: 6+10*nn); w_1= u(7+14*nn: 6+15*nn); xx=u([6;4;5]);
if t==0
ci_1=w0(1)*ones(3,nn); bi_1=w0(2)*ones(nn,1);
w_1=w0(3)*ones(nn,1); K_pid0=K_pid;
else, K_pid0=u(end-2:end); end
for j=1: nn % Gaussian ba
显示全部