请大家帮忙看一个模糊PID控制的M程序

2019-07-17 13:11发布

最近在写一个模糊PID控制的matlab m程序(原程序如下,)但是我运行的时候出现了如下这种错误:            

  1.         ??? Error using ==> close at 82         Specified window does not exist.        
  2.         
  3.         Error in ==> Fuzzypidm at 1        
  4.         close all;        
  5.          ??? Attempted to access rules(1,6); index out of bounds because        
  6.         size(rules)=[49,5].        
  7.         
  8.         Error in ==> setfis at 103        
  9.          fis.rule(i).weight=rules(i, numInputs+numOutputs+1);        
  10.         
  11.         Error in ==> addrule at 44        
  12.         fis=setfis(fis,'ruleList',newRuleList);        
  13.         
  14.         Error in ==> Fuzzypidm at 97        
  15.         a=addrule(a,rulelist);
复制代码
        
本人新手,不知道哪里有问题,请地里各位前辈帮忙看看程序。不甚感激!
  1. clear all;close all;
  2.         
  3. a=newfis('fuzzpidm');
  4.         
  5. a=addvar(a,'input','e',[-3,3]);
  6. a=addmf(a,'input',1,'NB','trimf',[-3,-3,-2]);
  7. a=addmf(a,'input',1,'NM','trimf',[-3,-2,-1]);
  8. a=addmf(a,'input',1,'NS','trimf',[-2,-1,0]);
  9. a=addmf(a,'input',1,'Z','trimf',[-1,0,1]);
  10. a=addmf(a,'input',1,'PS','trimf',[0,1,2]);
  11. a=addmf(a,'input',1,'PM','trimf',[1,2,3]);
  12. a=addmf(a,'input',1,'PB','trimf',[2,3,3]);
  13.         
  14. a=addvar(a,'input','ec',[-3,3]);
  15. a=addmf(a,'input',2,'NB','trimf',[-3,-3,-2]);
  16. a=addmf(a,'input',2,'NM','trimf',[-3,-2,-1]);
  17. a=addmf(a,'input',2,'NS','trimf',[-2,-1,0]);
  18. a=addmf(a,'input',2,'Z','trimf',[-1,0,1]);
  19. a=addmf(a,'input',2,'PS','trimf',[0,1,2]);
  20. a=addmf(a,'input',2,'PM','trimf',[1,2,3]);
  21. a=addmf(a,'input',2,'PB','trimf',[2,3,3]);
  22.         
  23. a=addvar(a,'output','kp',[0,3]);
  24. a=addmf(a,'output',1,'Z','trimf',[0,0,1]);
  25. a=addmf(a,'output',1,'PS','trimf',[0,1,2]);
  26. a=addmf(a,'output',1,'PM','trimf',[1,2,3]);
  27. a=addmf(a,'output',1,'PB','trimf',[2,3,3]);
  28.         
  29. a=addvar(a,'output','ki',[0,3]);
  30. a=addmf(a,'output',2,'Z','trimf',[0,0,1]);
  31. a=addmf(a,'output',2,'PS','trimf',[0,1,2]);
  32. a=addmf(a,'output',2,'PM','trimf',[1,2,3]);
  33. a=addmf(a,'output',2,'PB','trimf',[2,3,3]);
  34.         
  35. a=addvar(a,'output','kd',[0,3]);
  36. a=addmf(a,'output',3,'Z','trimf',[0,0,1]);
  37. a=addmf(a,'output',3,'PS','trimf',[0,1,2]);
  38. a=addmf(a,'output',3,'PM','trimf',[1,2,3]);
  39. a=addmf(a,'output',3,'PB','trimf',[2,3,3]);
  40.         
  41. rulelist=[1 1 6 4 5;
  42.     1 2 5 5 6;
  43.     1 3 6 6 7;
  44.     1 4 6 7 5;
  45.     1 5 6 6 5;
  46.     1 6 5 5 6;
  47.     1 7 6 4 7;
  48.             
  49.     2 1 7 4 5;
  50.     2 2 6 5 5;
  51.     2 3 7 7 6;
  52.     2 4 7 7 6;
  53.     2 5 7 7 4;
  54.     2 6 6 5 5;
  55.     2 7 5 4 5;
  56.             
  57.     3 1 7 4 5;
  58.     3 2 6 4 4;
  59.     3 3 7 7 4;
  60.     3 4 7 7 5;
  61.     3 5 7 7 6;
  62.     3 6 6 4 4;
  63.     3 7 5 4 5;
  64.             
  65.     4 1 7 4 7;
  66.     4 2 6 4 7;
  67.     4 3 7 7 5;
  68.     4 4 4 7 5;
  69.     4 5 7 7 5;
  70.     4 6 6 4 5;
  71.     4 7 5 4 4;
  72.             
  73.     5 1 7 4 4;
  74.     5 2 6 4 5;
  75.     5 3 7 7 6;
  76.     5 4 7 7 4;
  77.     5 5 7 7 5;
  78.     5 6 6 4 5;
  79.     5 7 5 4 5;
  80.             
  81.     6 1 7 4 5;
  82.     6 2 6 5 5;
  83.     6 3 7 7 5;
  84.     6 4 7 7 5;
  85.     6 5 7 7 5;
  86.     6 6 6 5 6;
  87.     6 7 5 4 5;
  88.             
  89.     7 1 6 4 7;
  90.     7 2 5 5 7;
  91.     7 3 6 6 5;
  92.     7 4 6 7 5;
  93.     7 5 6 6 7;
  94.     7 6 5 5 7;
  95.     7 7 6 4 5];
  96.         
  97. a=addrule(a,rulelist);
  98. a1=setfis(a,'DefuzzMethod','mom');%Defuzzy
  99. writefis(a1,'fuzzpidm');
  100.         
  101. a=readfis('fuzzpidm');
  102.         
  103. %PID controller
  104. ts=10;
  105. sys=tf(2,[144,1],'inputdelay',30);%
  106. dsys=c2d(sys,ts,'zoh');
  107. [num,den]=tfdata(dsys,'v');
  108.         
  109. u_1=0.0;u_2=0.0;u_3=0.0;u_4=0.0;
  110. y_1=0.0;
  111. x=[0,0,0]';
  112.         
  113. error_1=0;
  114. e_1=0.0;
  115. ec_1=0.0;
  116.         
  117. kp0=2.88;
  118. kd0=0.048;
  119. ki0=43.2;
复制代码
        
%看论坛上加zero限定值。?也不知道这里加的对不对,但是如果不加的话,for循环里面的以下变量就会出现warning:说变量的值会随着循环而变化,考虑以下preallocating 什么的...      
  1. time=zero(500);
  2. rin=zero(500);
  3. kp=zero(500);
  4. ki=zero(500);
  5. kd=zero(500);
  6. u=zero(500);
  7. yout=zero(500);
  8. error=zero(500);
  9.         
  10. for k=1:1:500;
  11. time(k)=k*ts;
  12.             
  13. rin(k)=1;
  14. %using fuzzy inference to tunning PID
  15. k_pid=evalfis([e_1,ec_1],a);
  16. kp(k)=k_pid(1);
  17. ki(k)=k_pid(2);
  18. kd(k)=k_pid(3);
  19. u(k)=kp(k)*x(1)+kd(k)*x(2)+10.5*ki(k)*x(3);
  20.          
  21. yout(k)=-den(2)*y_1+num(2)*u_4;
  22. error(k)=rin(k)-yout(k);
  23.          
  24. u_4=u_3;
  25. u_3=u_2;
  26. u_2=u_1;
  27. u_1=u(k);
  28.          
  29.          
  30. y_1=yout(k);
  31.          
  32. x(1)=error(k);
  33. x(2)=error(k)-error_1;
  34. x(3)=x(3)+error(k);
  35.          
  36. e_1=x(1);
  37. ec_1=x(2);
  38.          
  39. error_2=error_1;
  40. error_1=errpr(k);
  41. end
  42.         
  43. showrule(a)
  44. figure(1);plot(time,rin,'b',time,yout,'r');
  45. xlabel('time(s)');ylabel('rin,yout');
  46. figure(2);plot(time,error,'r');
  47. xlabel('time(s)');ylabel('error');
  48. figure(3);plot(time,u,'r');
  49. xlabel('time(s)');ylabel('u');
  50. figure(4);plot(time,kp,'r');
  51. xlabel('time(s)');ylabel('kp');
  52. figure(5);plot(time,ki,'r');
  53. xlabel('time(s)');ylabel('ki');
  54. figure(6);plot(time,kd,'r');
  55. xlabel('time(s)');ylabel('kd');
  56. figure(7);plotmf(a,'input',1);
  57. figure(8);plotmf(a,'input',2);
  58. figure(9);plotmf(a,'output',1);
  59. figure(10);plotmf(a,'output',2);
  60. figure(11);plotmf(a,'output',3);
  61. plotfis(a);
  62. fuzzy fuzzpidm.fis
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。