您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > BP神经网络整定的PID算法_matlab源程序
%BPbasedPIDControlclearall;closeall;xite=0.28;%学习速率alfa=0.001;%惯性系数IN=4;H=5;Out=3;%NNStructure(构造,神经网络结构)wi=0.50*rands(H,IN);wi_1=wi;wi_2=wi;wi_3=wi;wo=0.50*rands(Out,H);wo_1=wo;wo_2=wo;wo_3=wo;%构成变量Oh=zeros(H,1);%OutputfromNNmiddlelayerI=Oh;%InputtoNNmiddlelayererror_2=0;error_1=0;ts=0.01;sys=tf(2.6126,[1,3.201,2.7225]);%建立被控对象传递函数(LTIViewer对象模型sys=tf(num,den)将由传递函数模型所描述系统封装成对应的系统对象模型。dsys=c2d(sys,ts,'z');%把传递函数离散化(零阶保持器法离散化)[num,den]=tfdata(dsys,'v');%离散化后提取分子、分母(提取每项的常数)fork=1:1:2000%频率参数,构成一维数组time(k)=k*ts;rin(k)=40;yout(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_2+num(3)*u_3;error(k)=rin(k)-yout(k);xi=[rin(k),yout(k),error(k),1];x(1)=error(k)-error_1;%计算Px(2)=error(k);%计算Ix(3)=error(k)-2*error_1+error_2;%计算Depid=[x(1);x(2);x(3)];I=xi*wi';%theoutputoftheinputlayer,and1*5forj=1:1:HOh(j)=(exp(I(j))-exp(-I(j)))/(exp(I(j))+exp(-I(j)));%Middlelayer'soutputendK=wo*Oh;%OutputLayer(theinputofoutputlayer)forl=1:1:OutK(l)=exp(K(l))/(exp(K(l))+exp(-K(l)));%Gettingkp,ki,kdendkp(k)=K(1);ki(k)=K(2);kd(k)=K(3);Kpid=[kp(k),ki(k),kd(k)];du(k)=Kpid*epid;%theincrement(增加)oftheoutputuu(k)=u_1+du(k);%theoutputofthevalueofcontrollingifu(k)=45%Restricting(限制)theoutputofcontrolleru(k)=45;endifu(k)=-45u(k)=-45;enddyu(k)=sign((yout(k)-y_1)/(u(k)-u_1+0.0000001));%当x0时,sign(x)=-1当x=0时,sign(x)=0;当x0时,sign(x)=1。dyu(k)表示什么%Outputlayerforj=1:1:OutdK(j)=2/(exp(K(j))+exp(-K(j)))^2;%thevalueofg'()endforl=1:1:Outdelta3(l)=error(k)*dyu(k)*epid(l)*dK(l);%输出值endforl=1:1:Outfori=1:1:Hd_wo=xite*delta3(l)*Oh(i)+alfa*(wo_1-wo_2);%输出层权值的计算定义endendwo=wo_1+d_wo+alfa*(wo_1-wo_2);%wo更新%Hidden(隐藏)layerfori=1:1:HdO(i)=4/(exp(I(i))+exp(-I(i)))^2;%thevalueofthef'()endsegma=delta3*wo;%thesum(总和)fori=1:1:Hdelta2(i)=dO(i)*segma(i);%求δendd_wi=xite*delta2'*xi;wi=wi_1+d_wi+alfa*(wi_1-wi_2);%不就是wi修改更新的过程吗?个人认为:如果被控对象的表达式:'yout'改变的话,权值修改的中间过程都不要改变,因为不管系统的输出是什么,bp神经网络权值修改的公式都是一样的啊。有可能的话,可以把权值的初始值改一下,不是必须的,反正神经网络会自己调整权值,只要不陷入局部极小值就可以了(对不同的系统可以采取修改权值学习效率和惯性系数来调整神经网络的控制效果)%Parameters(参数,变量)Update(更新)u_5=u_4;u_4=u_3;u_3=u_2;u_2=u_1;u_1=u(k);%最后为什么进行更新y_2=y_1;y_1=yout(k);wo_3=wo_2;wo_2=wo_1;wo_1=wo;wi_3=wi_2;wi_2=wi_1;wi_1=wi;error_2=error_1;error_1=error(k);endfigure(1);plot(time,rin,'r',time,yout,'b');xlabel('time(s)');ylabel('rin,yout');figure(2);plot(time,error,'r');xlabel('time(s)');ylabel('error');figure(3);plot(time,u,'r');xlabel('time(s)');ylabel('u');figure(4);subplot(311);plot(time,kp,'r');xlabel('time(s)');ylabel('kp');subplot(312);plot(time,ki,'g');xlabel('time(s)');ylabel('ki');subplot(313);plot(time,kd,'b');xlabel('time(s)');ylabel('kd');本来按照原来的传递函数是有图形的,但是换了传递函数就出现这个样子是不是就像老师说的可以调节数轴。
本文标题:BP神经网络整定的PID算法_matlab源程序
链接地址:https://www.777doc.com/doc-4224260 .html