五、思考题
1.单神经元PID控制器的不足是什么?与什么因素有关?
单神经元PID控制器的控制效果依赖于控制规则、学习速率以及增益K的选
取。当控制规则选取不当时不能取得理想的控制效果;当参数选择不当时甚至会造成系统的发散,这与工程人员的经验有很大关系。
单神经元PID控制器与传统PID控制器相比结构更加复杂,对于简单地被控对象传统PID控制器便能取得很好地控制效果。
2.在传统PID控制器设计的基础上还有什么办法可以改进?
传统的PID控制器都是建立在精确完整的数学模型的基础上的,而实际生产
中往往不能得到被控对象精确的数学模型或者被控对象比较复杂,在这种情况下可以用模糊控制的方法代替传统PID控制器进行控制。模糊控制器可以根据模糊规则进行模糊推理,即使被控对象的信息不是十分完整根据模糊控制器的计算机制也能将结果推算出来。
此外,还有许多智能控制算法例如专家控制系统。它是基于专家的知识和经验的只能计算机控制系统。它更多的运用启发式的算法,对被控对象模型的精确性要求不是特别高,对于用户来说也更易于理解。
六、程序清单
%Single Neural Adaptive PID Controller clear all; close all;
x=[0,0,0]';
xiteP=0.40; %学习速率 xiteI=0.35; xiteD=0.40;
%Initilizing kp,ki and kd wkp_1=1; 权系数初值 wki_1=1; wkd_1=1;
% wkp_1=rand; % wki_1=rand; % wkd_1=rand;
11
error_1=0; %前一拍采样值为零 error_2=0; y_1=0;y_2=0;y_3=0; u_1=0;u_2=0;u_3=0;
ts=0.001; for k=1:1:1000 time(k)=k*ts;
rin(k)=stepfun(k*ts,(k-1)*ts); %输入阶跃信号 if k<=150
yout(k)=0.368*y_1+0.26*y_2+0.1*u_1+0.632*u_2; %控制信号 elseif k<=300
yout(k)=0.368*y_1+0.26*y_2+0.1*u_1+0.632*u_2-0.2*stepfun((k-150)*ts,(k-151)*ts); else
yout(k)=0.368*y_1+0.26*y_2+0.1*u_1+0.632*u_2; end
error(k)=rin(k)-yout(k) ;%误差信号 -justing Weight Value by hebb learning algorithm M=3;
if M==1 %无监督的Hebb学习规则 wkp(k)=wkp_1+xiteP*u_1*x(1); wki(k)=wki_1+xiteI*u_1*x(2); wkd(k)=wkd_1+xiteD*u_1*x(3); K=0.06;
elseif M==2 %有监督的Delta学习规则 wkp(k)=wkp_1+xiteP*error(k)*u_1; wki(k)=wki_1+xiteI*error(k)*u_1; wkd(k)=wkd_1+xiteD*error(k)*u_1; K=0.12;
elseif M==3 %有监督的Hebb学习规则 wkp(k)=wkp_1+xiteP*error(k)*u_1*x(1); wki(k)=wki_1+xiteI*error(k)*u_1*x(2); wkd(k)=wkd_1+xiteD*error(k)*u_1*x(3);
K=0.12; %神经比例系数
elseif M==4 %改进的学习规则
wkp(k)=wkp_1+xiteP*error(k)*u_1*x(1)*(2*error(k)-error_1); wki(k)=wki_1+xiteI*error(k)*u_1*x(2)*(2*error(k)-error_1); wkd(k)=wkd_1+xiteD*error(k)*u_1*x(3)*(2*error(k)-error_1); K=0.12; end
12
x(1)=error(k); %三个状态量 x(2)=error(k)-error_1; x(3)=error(k)-2*error_1+error_2;
wadd(k)=abs(wkp(k))+abs(wki(k))+abs(wkd(k)); w11(k)=wkp(k)/wadd(k); w22(k)=wki(k)/wadd(k); w33(k)=wkd(k)/wadd(k); w=[w11(k),w22(k),w33(k)];
u(k)=u_1+K*w*x;
if u(k)>10 %限幅控制 u(k)=10; end
if u(k)<-10 u(k)=-10; end
error_2=error_1; error_1=error(k);
u_3=u_2;u_2=u_1;u_1=u(k); y_3=y_2;y_2=y_1;y_1=yout(k);
wkp_1=wkp(k); wkd_1=wkd(k); wki_1=wki(k); end
figure(1);
plot(time,rin,'b','LineWidth',4); hold on;
plot(time,yout,'r','LineWidth',2); xlabel('time(s)'); ylabel('rin,yout');
legend(['输入信号'],['追踪信号']); title('改进的Hebb学习规则(k=0.06)');
figure(2);
plot(time,error,'r'); xlabel('time(s)'); ylabel('error'); legend('误差曲线');
title('改进的Hebb学习规则(k=0.06)');
13
控制信号 %
figure(3); plot(time,u,'r'); xlabel('time(s)'); ylabel('u');
legend('控制输出曲线');
title('改进的Hebb学习规则(k=0.06)');
14