资源描述
内蒙古科技大学
控制系统仿真课程设计说明书
题 目:单神经元PID控制系统仿真
学生姓名:
学 号:
专 业:测控技术与仪器
班 级:
指导教师:
中文摘要
PID控制以其原理简单,可靠性高等优点被广泛应用在现代工业控制领域。然而在工业实际控制中,被控对象往往还具有高度的非线性,不确定性和参数时变等特点,在这种情况下单纯依靠PID控制是不能达到要求的。神经网络控制系统作为新兴发展的智能控制系统,能很好地解决上述问题,已经在很多领域得到应用,同时也显示了它的优越性。
单神经元作为构成神经网络的基本单元,具有自学习和自适应能力,且结构简单而易于计算。基于以上分析,在PID控制中引入单神经元自适应算法,这样既可以解决传统PID控制器的不足,同时又能充分利用PID控制技术成熟的优势。通过仿真对比发现单神经元自适应PID控制器比传统的PID控制器控制效果好。
关键词: 单神经元;自适应PID控制;神经网络;
第一章 前言
1.1引言
人工神经网络ANN(artificial neural network)是最近发展起来的十分热门的交叉学科。它涉及生物、电子计算机、数学、和物理等学科,有着非常广泛的应用背景,这门学科的发展对目前和未来的科学技术的发展将有着重要的影响。以大规模并行处理为主要特征的神经网络具有学习、记忆、联想、容错、并行处理等能力,已在控制领域得到广泛的应用。基于神经网络的PID控制,其结构方式有两类:一类是单神经元控制,即神经元输入权值一一对应PID参数,神经元输入值为经过比例、积分、微分处理的偏差值,其主要局限性在于单神经元结构无任意函数逼近能力;另一类是在常规PID控制器的基础上增加一个神经网络模块,按照BP学习算法(如前向算法和反传算法)进行离线学习,实时调整出PID参数,同时还要继续学习不断地调整神经网络中各神经元间权系数,以适应被控对象的变化,因此,具有很强的适应性。
1.2单神经元模型
对人脑神经元进行抽象简化后得到一种称为McCulloch-Pitts模型的人工神经元,如图1.1所示。
图1.1 单神经元模型示意图
对于第i个神经元,(1-1)。
(1-1)
此作用引起神经元i的状态变化,而神经元i的输出yi是其当前状态的函
数g(•),称之为活化函数(State of activation)。这样,上述模型的数学表达式为式(1-2)。
(1-2)
1.3 MATLAB及SIMULINK简介
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户可以直接进行下载就可以用。
Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模、仿真和分析的一个软件包.Simulink可以用连续采样时间、离散采样时间或两种混合的采样时间进行建模,它也支持多速率系统,也就是系统中的不同部分具有不同的采样速率.Simulink®是用于动态系统和嵌入式系统的多领域仿真和基于模型的设计工具。对各种时变系统,包括通讯、控制、信号处理、视频处理和图像处理系统,Simulink提供了交互式图形化环境和可定制模块库来对其进行设计、仿真、执行和测试。
1.5 S函数
S-Function是一个动态系统的计算机语言描述,在MATLAB里,用户可以选择用m文件编写,也可以用c语言或mex文件编写,在这里只介绍如何用m文件编写S-Function。S-function提供了扩展Simulink模块库的有力工具,它采用一种特定的调用语法,使函数和Simulink解法器进行交互。
S-function最广泛的用途是定制用户自己的Simulink模块。它的形式十分通用,能够支持连续系统、离散系统和混合系统。
第2章 控制系统的设计
2.1神经网络自适应控制系统
神经网络在自适应控制中具有突出的优势,它可以通过不断地学习获取有关对象的知识并适应过程的变化。神经网络模型参考自适应控制和自校正控制在实际应用中均显示出突出的优点。此外,神经网络的引入还是直接自适应控制得以实现。
图2.1为神经网络直接自适应控制系统框图。此神经网络采用多层前向网络。BP训练算法,即按信息正向传递,误差反向传播的学习算法。这种算法在模式识别,智能控制等许多领域得到广泛应用。
图2.1 神经网络直接自适应系统框图
2.2单神经元元自适应PID控制系统
神经元作为构成神经网络的基本单元,具有自学习和自适应的能力,而且结构简单易于计算。传统的PID调节器也具有结构简单、调整方便和参数整定与工程指标联系密切等特点。将两者结合,便可以在一定程度上解决传统PID调节器不易在线实时整定参数和难于对一些复杂过程和参数慢时变系统进行有效控的不足。用神经元实现的自适应PID控制器结构框图如图2.2所示
e
∑
k
对象
x1
x2
x3
x3
+
-
+
yout
rin
图2.2 单神经元自适应PID控制框图
2.3单神经元PID控制算法
如图2.1,状态转换器的输入反映被控对象及控制设定的状态。转换器的输出为神经面学习控制所需的状态量,控制信号由神经元通过关联搜索和自学习产生。设定输入为给定值,为输出值,经状态变换器转换后成为神经元学习控制所需的状态量。这里:
反映了系统误差变化的积累(相当于积分项)
反映了误差的变化(相当于比例项)
反映了误差变化的一阶差分(相当于微分项)
为性能指标或递进信号,为一个教师信号;
为对应于的加权系数;
为神经元的比例系数,为大于0的数。
那么有:
(2.1)
即有:
= (2.2)
试比较(3.4)与(3.9)可以看出PID参数分别为(积分系数),(比例系数),(微分系数)。故该神经元控制器具有PID控制器的特性,它通过对加权系数的调整来实现自适应,自组织功能。所以该神经元PID控制器是一类在线自适应PID控制器。这种自适应能力是通过一定的学习规则进行的,而学习规则可以通过计算算法实现,因此神经元PID控制器的性能取决于学习算法的收敛性和自学习能力。如何获得更完善的自学习能力、联想能力的算法是关键。解决好学习算法的快速性和收敛性,便可以大大推进神经网络控制在工业生产过程中的实用化进程。本文中采用Delta学习规则。
即
(2.3)
(2.4)
式中,——学习(或强化)信号,它随着过程的进行缓慢地衰减。
——学习速率,。
该学习规则表示对一个动态特性未知的环境,自适应神经元在教师信号作用下进行强制学习,从而对外界作用作出反映和作用。神经元权系数的学习确保系统的跟踪误差收敛于零。只要跟踪误差存在,学习过程就会使权值变化,从而使误差以最快的速度趋于零。这样就通过关联搜索保证了系统的无静差。只要保证学习算法的收敛性,调节系统就可以实现无静差和快速响应的控制效果。通常学习速率对保证学习的收敛性有很大的关系,要由仿真分析来选择适当的学习速率。
为了加快神经元PID控制器的学习速率,通常希望学习速率的取值大一些。在值选择较大时,为保证上述单神经元P1D控制学习算法的收敛性与鲁棒性,对学习算法进行规范化处理:
(2.5)
= (2.6)
(2.7)
(2.8)
(2.9)
式中,为积分、比例、微分的学习速率;
= (2.10)
= (2.11)
== (2.12)
这里对积分(I)、比例(P)、微分(D)分别采用不同的学习速率,以便对它们各自的权系数能根据需要分别进行调整。采用不同的学习速率进行学习,可以防止某些项因为相差太大而被淹没,其取值可先由现场实验或仿真来确定。
这里选取的一般规则如下:
①对于阶跃响应,若输出有大的超调,且多次出现正弦衰减现象,应减少维持不变;若上升时间长,无超调,应增大,保持不变。
②对于阶跃输入,若被控对象产生多次正弦衰减现象,应减少,其他参数不变。
③若被控对象响应特件出现上升时间短、超调过大现象,应减少,,其他参数不变。
④若被控对象上升时间长,增大又导致超调过大,可适当增加,,其他参数不变。
⑤在开始调整时,选择较小值,当调整,和,使被控对象具有良好特性时,再逐渐增大,而其他参数不变,使系统输出基本无波纹。
⑥K是系统最敏感的参数。值的变化,相当于三项同时变化,应在第一步先调整,然后根据“②~⑤”项调整规则调整。
2.4被控对象的设定
受控对象由差分方程给出
y(k)=0.368y(k-1)+0.26y(k-2)+0.10u(k-1)+0.632u(k-2) (2.13)
两端取Z变换,并加以整理得: G(z)= (2.14)
采样周期为T=0.001s,输人为一阶跃信号rin(k)=1,分别用单神经元PID和常规PID进行控制,并进行比较。
第3章 单神经元PID系统仿真研究
3.1建立m文件S-Function
3.1. 1使用模板文件:sfuntmp1. m 格式: [sys,x0]=function(t,x,u,flag)
该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下。
模板文件里S-Function的结构十分简单,它只为不同的flag的值指定要相应调用的m文件子函数。比如当flag=3时,即模块处于计算输出这个仿真阶段时,相应调用的子函数为sys=mdloutputs(t,x,u)。
模板文件使用switch语句来完成这种指定,当然这种结构并不唯一,用户也可以使用if语句来完成同样的功能。而且在实际运用时,可以根据实际需要来去掉某些值,因为并不是每个模块都需要经过所有的子函数调用。
模板文件只是Simulink为方便用户而提供的一种参考格式,并不是编写S-Function的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。
使用模板编写S-Function,用户只需把s-函数名换成期望的函数名称,如果需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的4个参数是Simulink调用S-Function时自动传入的。对于输出参数,最好不做修改。接下去的工作就是根据所编S-Function要完成的任务,用相应的代码去替代模板里各个子函数的代码即可。
Simulink在每个仿真阶段都会对S-Function进行调用,在调用时,Simulink会根据所处的仿真阶段为flag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由Simulink自动完成。
m文件S-Function可用的子函数说明如下:
mdlInitializeSizes(flag=0):定义S-Function模块的基本特性,包括采样时间、连续或者离散状态的初始条件和sizes数组。
mdlDerivatives(flag=1):计算连续状态变量的微分方程。
mdlUpdate(flag=2):更新离散状态、采样时间和主时间步的要求。
mdlOutputs(flag=3):计算S-Function的输出。
mdlGetTimeOfNextVarHit(flag=4):计算下一个采样点的绝对时间,这个方法仅仅是在用户在mdlInitializeSizes 里说明了一个可变的离散采样时间。
mdlTerminate: 结束仿真任务。
概括说来,建立S-Function可以分成两个分离的任务:
(1)初始化模块特性包括输入输出信号的宽度,离散连续状态的初始条件和采样时间。
(2)将算法放到合适的S-Function子函数中去。
为了让Simulink识别出一个m文件S-Function,用户必须在S-Function函数里提供有关S-Function函数的说明信息,包括采样时间、连续或者离散状态个数等初始条件。这一部分主要是在mdlInitializeSizes子函数里完成。
Sizes数组是S-Function函数信息的载体,它内部的字段意义为:
NumContStates(sys(1)):连续状态的个数(状态向量连续部分的宽度)
NumDiscStates(sys(2)):离散状态的个数(状态向量离散部分的宽度)
NumOutputs(sys(3)): 输出变量的个数(输出向量的宽度)
NumInputs(sys(4)):输入变量的个数(输入向量的宽度)
DirFeedthrough(sys(5)):有无直接馈入。注意:DirFeedthrough是一个布尔变量,它的取值只有0和1两种。0表示没有直接馈入,此时用户在编写mdlOutputs子函数时就要确保子函数的代码里不出现输入变量u;1表示有直接馈入。
NumSampleTimes(sys(6)):采样时间的个数,也就是ts变量的行数,与用户对ts的定义有关,有无代数循环标志。
如果字段代表的向量宽度为动态可变,则可以将它们赋值为-1。需要指出的是,由于S-Function会忽略端口,所以当有多个输入变量或多个输出变量时,必须用mux模块或demux模块将多个单一输入合成一个复合输入向量或将一个复合输出向量分解为多个单一输出。
3.1.2输入和输出参量说明
S-function默认的4个输入参数为t、x、u和flag,它们的次序不能变动,代表的意义分别为:
t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。
x:表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具有很灵活的运用。
u:表示输入向量。
flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由Simulink在调用时自动取值。
S-function默认的4个返回参数为sys、x0、它们的次序不能变动,代表的意义分别为:
sys:是一个通用的返回参数,它所返回值的意义取决于flag的值。
x0:是初始的状态值(没有状态时是一个空矩阵[]),这个返回参数只在flag值为0时才有效,其他时候都会被忽略。
str: 这个参数没有什么意义,是mathworks公司为将来的应用保留的,M文件S-Function必须把它设为空矩阵。
ts: 是一个m×2的矩阵,它的两列分别代表采样时间间隔和偏移。
3.2 单神经元控制器Simulink 模型
由于神经元PID 控制器不能直接用传递函数加以描述,若简单地应用SIMULINK 将无法对其进行仿真,
此时应引入S函数。基于改进的Hebb 学习规则编制神经元PID 控制器的S函数后建立的仿真模型.神经元PID控制模块机构图如图3.1所示。
图3.1单个神经元的PID控制器模板框图
当K、ηp,ηi,ηd,,分别取0.12、0.3、0.3、0.5时,输入信号为单位阶跃信号时,输出响应曲线如图3.2所示:
图4 K=0.12时的输出响应曲线
通过比较得知,K是一个比较敏感的系数,K值的增大,减小相当于P、I、D三项同时增加、减小,同时K值过大会导致系统发生振荡。
3.3结论
仿真结果说明.单神经元自适应PID控制本质上是非线性控制.具有良好的自适应能力,能有效地减小超调,缩短调节时间。综合评价的结果,单神经元自适应PID控制方法具有优于常规PID控制的效果.而采用以输出误差平方为性能指标的单神经元自适应PID控制器的控制效果优于采用有监督Hebb学习算法的单神经元自适应PID控制器。
第四章 总结
通过本次毕业设计,使我更进一步加深了怎样分析问题和解决问题,加强了对已学过知识的理解,增强了实际应用能力,同时也开阔了视野。
比例系数学习率越大则超调量越小,但是响应速度也会越慢;(2)在比例学习率、微分学习率不变的情况下,积分系数学习率越大则响应会越快,但是超调量也会越大;(3)在比例学习率、积分学习率不变的情况下,微分学习率对单神经元PID控制器的控制效果影响不大;(4)K是系统最敏感的参数,K值增大、减小相当于P、I、D三项同时增加、减小,同时K 值过大会使系统发生振荡,导致系统发散,所以对于K值应合理选择。单神经元自适应PID控制算法在总体上优于传统的PID控制算法,它有利于控制系统控制品质的提高,受环境的影响较小,具有较强的控制鲁棒性,是一种很有发展前景的控制器。同时对单神经元自适应PID控制算法进行改进,使增益K能够自调整,通过仿真发现这种改进算法能使控制效果变得更好。
参考文献
[1]李国勇,控制系统数字仿真与CAD[M],北京:电子工业出版社,2003,9月
[2]薛定宇,控制系统仿真与计算机辅助设计[M],北京:机械工业出版社,2005,1月
[3]徐丽娜,神经网络控制[M],哈尔滨:哈尔滨工业大学出版社,1998,11
[4]刘金琨,先进PID控制及其MATLAB仿真[M],北京:电子工业出版社,2003,8
[5]张静,马俊丽,岳境,等.MATLAB在控制系统中的应用[M].北京:电子工业出版社,2007
[6] 焦李成. 神经网络系统理论[M ]. 西安: 西安电子科技大学出版社, 1995.
[7]陶永华,尹怡欣,葛芦生.新型PID控制及其应用[M].北京:机械工业出版社 1998.9.
[8]徐英, 徐用懋, 杨尔辅. 时变大滞后系统的单神经元预测控制[ J] . 清华大学学报( 自然科学版) ,2002,4
[9]舒怀林. PID 神经元网络对强耦合带时延多变量系统的解耦控制[ J] . 控制理论与应用, 1998, 15 16) : 920924.
[10]舒怀林. 基于神经PID 网络的串级调节系统研究[J] . 自动化与仪器仪表, 1997, ( 5) : 4549.
[11]王正林,王胜开,陈国顺,等.MATLAB/Simulink与控制系统仿真(第2版)[M].北京:电子工业出版社,2008.
附录
function [sys,x0,str,ts]=lcczy(t,x,u,flag,deltak)
deltak=[0.8;0.8;0.5];
switch flag,
case 0, [sys,x0,str,ts]=mdlInitializeSizes;
case 2,sys=mdlUpdate(t,x,u,deltak);
case 3,sys=mdlOutputs(t,x,u);
case {1,4,9},sys=[];
otherwise ,error(['Unhandled flag=',num2str(flag)]);
end;
function [sys,x0,str,ts]=mdlInitializeSizes
sizes=simsizes;
sizes.NumContStates=0;sizes.NumDiscStates=3;
sizes.NumOutputs=4;sizes.NumInputs=4;
sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;
sys=simsizes(sizes);x0=[0.3*rand(3,1)];
str=[]; ts=[-1 0];
function sys=mdlUpdate(t,x,u,deltak)
sys=x+deltak*u(1)*u(4)*(2*u(1)-u(2));
function sys=mdlOutputs(t,x,u)
xx=[u(1)-u(2) u(1) u(1)+u(3)-2*u(2)];
sys=[u(4)+0.08*xx*x/sum(abs(x));x/sum(abs(x))];
展开阅读全文