Î塢˼¿¼Ìâ
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; %ǰһÅIJÉÑùֵΪÁã 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