
计算机控制原理与应用作业-基于遗传算法的PID参数整定(共19页).docx
19页精选优质文档-----倾情为你奉上计算机控制原理与应用仿真作业基于遗传算法的数字PID控制器参数整定设计 控制工程专业2012年12月目录专心---专注---专业一、问题重述在工业过程控制系统中,PID控制仍是应用最为广泛的控制方法PID控制器参数的整定对于系统的性能指标有很大的影响,除了工程上常用的过渡过程响应法,临界稳定测量法,归一参数整定法等,PID控制器的参数也可以直接根据离散的被控对象模型及其要求的性能指标来确定,可以通过参数寻优的方法来确定PID控制器的参数对于式(1.1)的PID控制器(z变换形式),可以采用式(1.2)的二次型性能指标函数uk=Kp+Ki11-z-1+Kd1-z-1ek (1.1)J=k=0∞e2(k)+ρu2(k) (1.2)其中ρ为常数,取值范围为0≤ρ≤1 已知某伺服系统的对象传递函数为Gs=1s(10s+1) (1.3)对此伺服系统设计PID控制器,利用参数寻优的遗传算法,求得使性能指标J取得极小值的控制器参数。
二、问题分析及算法设计2.1遗传算法基本介绍遗传算法(Genetic Algorithm, GA),是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型它是由美国Michigan大学的J. Holland教授于1975年首先提出的遗传算法研究的兴起是在80年代末和90年代初期,无论是理论研究还是应用研究都成了十分热门的课题遗传算法的应用领域也不断扩大目前遗传算法所涉及的主要领域有自动控制、规划设计、组合优化、图象处理、信号处理、人工生命等 遗传算法模拟自然选择和自然遗传过程中发生的繁殖、交叉和基因突变现象,在每次迭代中都保留一组候选解,并按某种指标从解群中选取较优的个体,利用遗传算子(选择、交叉和变异)对这些个体进行组合,产生新一代的候选解群,重复此过程,直到满足某种收敛指标为止 遗传算法中最优解的搜索过程也是模仿生物的进化过程,通过染色体之间的交叉和染色体的变异来完成通过所谓的遗传算子(genetic operators)作用于群体中,进行遗传操作,从而得到新一代群体遗传算子包括选择算子,交叉算子,变异算子遗传算法基本操作包括:编码(产生初始种群);遗传算子的运算(包括选择、交叉、变异);适应度函数的确定等。
此节只做简单介绍,就具体问题的实际操作介绍见下节中算法设计遗传算法具有以下的特点:(1) 遗传算法是对参数的编码进行操作,而非对参数本身;(2) 遗传算法是从许多点开始并行操作,而非局限于一点;(3) 遗传算法通过目标函数来计算适配值,而不需要其他推导,从而对问题的依赖性较小;(4) 遗传算法的寻优规则是由概率决定,而非确定性的;(5) 遗传算法在解空间进行高效启发式搜索,而非盲目地穷举或完全随机搜索;(6) 遗传算法对于待寻优的函数基本无限制,它既不要求函数连续,也不要求函数可微,既可以是数学解析式所表示的显函数,又可以是映射矩阵甚至是神经网络的隐函数,因此应用范围较广;(7) 遗传算法具有并行计算的特点,因而可以通过大规模并行计算来提高计算速度;(8) 遗传算法更适合大规模复杂问题的优化;(9) 遗传算法计算简单,功能强2.2数字PID参数整定数字PID控制器源于模拟PID控制器,基本数字PID控制算法包括增量式PID控制算法(2.1)和位置式PID控制算法(2.2)∆uk=Kpek-e(k-1)+Kiek+Kdek-2ek-1+e(k-2) (2.1)uk=uk-1+Kpek-ek-1+Kiek+Kdek-2ek-1+e(k-2) (2.2)其中u(t)为控制器输出;e(k)为偏差输入;Kp为比例系数;Ki为积分系数;Kd为微分系数。
实际应用中究竟是使用位置式PID算法还是增量式PID算法,关键是看执行机构的特性如果执行机构具有积分特性的部件(如步进电动机、具有齿轮传递特性的位置执行机构等),则应该采用增量式PID算法;如果执行机构没有积分特性部件,则应该采用位置式PID算法2.3基于遗传算法的PID参数整定目前PID参数的优化方法有很多,如间接寻优法,梯度法,爬山法等虽然这些方法都具有良好的寻优特性,但却存在着一些弊端,单纯形法对初值比较敏感容易陷入局部最优化解,造成寻优失败因此我们选取了遗传算法来进行参数寻优该方法是一种不需要任何初始信息并可以寻求全局最优解的高效的优化组合方法遗传算法作为一种全局优化算法,得到了越来越广泛的应用近年来,它在控制上应用日益增多采用遗传算法进行PID三个参数的整定,具有以下优点:(1) 与单纯形法相比,遗传算法同样具有良好的寻优特性,且克服了单纯形法参数初值的敏感性在初始条件选择不当的情况下,遗传算法在不需要给出调节器初始参数的情况下,仍能寻找到合适的参数,使控制目标满足要求同时单纯形答难以解决多值函数问题以及在多参数寻优(如串级系统)中,容易造成寻优失败或时间过长,而遗传算法的特性决定了它能很好地克服以上问题。
2) 遗传算法是从许多点开始并行操作,在解空间进行高效启发式搜索,克服了从单点出发的弊端以及搜索的盲目性,从而使寻优速度更快,避免了过早陷入局部最优解3) 遗传算法不仅使用于单目标寻优,而且也使用于多目标寻优根据不同的控制系统,针对一个或多个目标,遗传算法均能在规定的范围内寻找到合适的参数三、仿真实验设计仿真实验就是把遗传算法在数字PID参数整定上的应用过程在计算机上实现出来,包括编码和解码,初始种群的确定,性能指标的确定,遗传算子的确定,算法设计几个部分本文采用C语言编程,采用c-free软件编译执行3.1 编码和解码我们把待寻优的参数用一个二进制数来表示若参数α的变化范围为αmin,αmax,用m 位二进制数b来表示,则它们的关系为: α=αmin+b2m-1αmax-αmin (3.1) 将所有表示参数的二进制数放入一个列向量中该列向量的每个元素即为需要寻优的参数该向量即为遗传算法可以操作的对象此过程为编码上述过程的反过程为解码1) PID参数的编码用长度为m=10位的二进制编码串可以表示从0到1023之间的1024个不同的数,故将的定义域离散化为1023个均等的区域,包括两个端点在内共有1024个不同的离散点。
参数的取值范围为[0,20],的取值范围为[0,1],的取值范围为[0,10]对于从离散点0到20,依次让它们分别对应于从(0)到(1023)之间的二进制编码;对于从离散点0到1,依次让它们分别对应于从(0)到(1023)之间的二进制编码用长度为10位的二进制编码串来分别表示三个决策变量,再将它们放到一个列向量(染色体)中,例如:X=KP Ki KdT= T (3.2)其中三个元素分别代表 三个参数 (2) PID参数的解码解码时需要分别将它们转换为对应的十进制整数代码,其中二进制编码分别记为依据前述个体编码方法和对定义域的离散化方法可知,将代码转换为变量根据解码公式得: Kp=20y1210-1+0; Kp=10y2210-1+0; Kp=1y3210-1+0; (3.3)3.2 初始种群的确定适应函数应同目标函数相关,遗传算法寻优就是因为需要编程来实现各过程,所以采用计算机随机产生初始种群,针对二进制编码而言,利用计算机语言随机产生一组初始种群。
此外,考虑到计算的复杂程度来规定种群的大小种群中染色体越多 最终进化到最优解的可能性越大, 但势必造成计算时间的增加因此其个数一般选为10 ~ 50本文针对提出的问题选定种群的大小为30,用一个330的矩阵X来表示:X=X11X12⋯ X21X22⋯ X31X32⋯ X1,30X2,30X3,30 (3.4)其中X的每一列都代表一个染色体用C语言编写的产生初始种群的程序为:srand( (unsigned)time( NULL ) ); //*使用当前的时钟作为随机数的种子*// for(i=0;i<=2;i++) for(j=0;j<=29;j++) gene[i][j]=randomi(1024); //*给初始种群随机初始化*//其中gene为种群矩阵Randomi()为调用的产生随机数的函数3.3性能指标函数的确定性能指标函数采用式(1.2),即J=k=0∞e2(k)+ρu2(k) 其中e(k) 为误差序列,u(k) 为控制量序列两个序列产生于差分函数(2.2),通过迭代产生两组数列,然后带入(1.2)式中从而得出适值的大小J。
用C语言编写的产生初始种群的程序为:J=0.0;for(k=0;k<100;k++) //*计算适应值,即目标函数值*// J=J+(E[k]*E[k]+0.5*U[k]*U[k]);3.4遗传算子的确定遗传算法有三个算子: 选择算子,交叉算子,变异算子每个算子都有算子概率选择概率通过适配值来确定,交叉概率决定了交叉的次数,过小导致搜索停滞不前; 而太大也会使高适配置的结构被破坏掉因此, 交叉概率一般选取0.25 ~ 0.8 之间变异概率一般为0.001 ~ 0.1 ,太大会引起不稳定,太小难以寻到全局最优解3. 4.1 选择算子的确定在本文中的选择算子采用经典的轮盘赌方法选择下一代的种群具体方式为先计算当前种群中每个个体的适应值,然后对适应值进行处理,也就是对每个适应值取倒数得到新的适应值然后计算每个新的适应值在所有适应值总和中所占的比率pi产生0-1之间的随机数来选择个体这样pi值大的个体被选择到下一代的可能性就更大用C语言编写的程序如下:for(i=0;i<30;i++) p[i]=1.0/adap_value[i];float sum=0.0,ratio[30];for(i=0;i<30;i++) sum=sum+p[i]; //*制作轮盘*//for(i=0;i<30;i++) ratio[i]=p[i]/sum; for(i=1;i<30;i++) ratio[i]=ratio[i]+ratio[i-1]; srand( (unsigned)time( NULL ) ); //*进行选择*// while((sum<=ratio[i+1])&&(sum>ratio[i])||(sum<=ratio[0])&&(sum>ratio[29])) { gene1[0][j]=gene[0][i+1。
