请大家帮忙看一个模糊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
复制代码

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
路过秋天
1楼-- · 2019-07-17 17:44
a1=setfis(a,'DefuzzMethod','mom');%Defuzzywritefis(a1,'fuzzpidm');


a1改成a
神之小风
2楼-- · 2019-07-17 22:18
路过秋天 发表于 2012-4-12 16:01
a1=setfis(a,'DefuzzMethod','mom');%Defuzzywritefis(a1,'fuzzpidm');

谢谢你的回答
可是改了,还是不行。。。

??? Error using ==> parsrule at 181
Output MF index is too high

Error in ==> readfis at 231
out=parsrule(out,txtRuleList,'indexed');

Error in ==> Fuzzypidm at 102
a=readfis('fuzzpidm');
路过秋天
3楼-- · 2019-07-18 00:17
嗯 我习惯性的把fuzzy和PID控制分成2个函数来写 分别编译2个M文件

给你一个FUZZY PI控制 应该是好用的 你对照着看一下吧 程序就不给你细看了

  1. %Fuzzy Tunning PI Controlclear all;close all;a=newfis('fuzzpid');
  2. a=addvar(a,'input','e',[-1,1]); %Parameter ea=addmf(a,'input',1,'N','zmf',[-1,-1/3]);a=addmf(a,'input',1,'Z','trimf',[-2/3,0,2/3]);a=addmf(a,'input',1,'P','smf',[1/3,1]);
  3. a=addvar(a,'input','ec',[-1,1]); %Parameter eca=addmf(a,'input',2,'N','zmf',[-1,-1/3]);a=addmf(a,'input',2,'Z','trimf',[-2/3,0,2/3]);a=addmf(a,'input',2,'P','smf',[1/3,1]);
  4. a=addvar(a,'output','kp',1/3*[-10,10]); %Parameter kpa=addmf(a,'output',1,'N','zmf',1/3*[-10,-3]);a=addmf(a,'output',1,'Z','trimf',1/3*[-5,0,5]);a=addmf(a,'output',1,'P','smf',1/3*[3,10]);
  5. a=addvar(a,'output','ki',1/30*[-3,3]); %Parameter kia=addmf(a,'output',2,'N','zmf',1/30*[-3,-1]);a=addmf(a,'output',2,'Z','trimf',1/30*[-2,0,2]);a=addmf(a,'output',2,'P','smf',1/30*[1,3]);
  6. rulelist=[1 1 1 2 1 1;1 2 1 2 1 1;1 3 1 2 1 1;
  7. 2 1 1 3 1 1;2 2 3 3 1 1;2 3 3 3 1 1;
  8. 3 1 3 2 1 1; 3 2 3 2 1 1;3 3 3 2 1 1];a=addrule(a,rulelist);a=setfis(a,'DefuzzMethod','centroid');writefis(a,'fuzzpid');
  9. a=readfis('fuzzpid');figure(1);plotmf(a,'input',1);figure(2);plotmf(a,'input',2);figure(3);plotmf(a,'output',1);figure(4);plotmf(a,'output',2);figure(5);plotfis(a);
  10. fuzzy fuzzpid;showrule(a)ruleview fuzzpid;
  11. =========================================
  12. %Fuzzy PI Controlclose all;clear all;
  13. warning off;a=readfis('fuzzpid'); %Load fuzzpid.fis
  14. ts=0.001;sys=tf(133,[1,25,0]);dsys=c2d(sys,ts,'z');[num,den]=tfdata(dsys,'v');
  15. u_1=0;u_2=0;y_1=0;y_2=0;e_1=0;ec_1=0;ei=0;
  16. kp0=0;ki0=0;for k=1:1:1000time(k)=k*ts;
  17. yd(k)=1;%Using fuzzy inference to tunning PIk_pid=evalfis([e_1,ec_1],a);kp(k)=kp0+k_pid(1);ki(k)=ki0+k_pid(2);u(k)=kp(k)*e_1+ki(k)*ei;
  18. y(k)=-den(2)*y_1-den(3)*y_2+num(2)*u_1+num(3)*u_2;e(k)=yd(k)-y(k);%%%%%%%%%%%%%%Return of parameters%%%%%%%%%%%%%%%u_2=u_1;u_1=u(k); y_2=y_1;y_1=y(k);
  19. ei=ei+e(k)*ts; % Calculating I
  20. ec(k)=e(k)-e_1;e_1=e(k);ec_1=ec(k);endfigure(1);plot(time,yd,'r',time,y,'k:','linewidth',2);xlabel('time(s)');ylabel('yd,y');legend('ideal position','position tracking');figure(2);subplot(211);plot(time,kp,'r','linewidth',2);xlabel('time(s)');ylabel('kp');subplot(212);plot(time,ki,'r','linewidth',2);xlabel('time(s)');ylabel('ki');figure(3);plot(time,u,'r','linewidth',2);xlabel('time(s)');ylabel('Control input');
复制代码


栅栏间隙偷窥你
4楼-- · 2019-07-18 02:57
你好,a=readfis()语句出错的问题解决了吗? 如果解决了能告诉我方法吗?我也遇到了同样的问题

一周热门 更多>