搜索
bottom↓
回复: 7

模糊自适应PID控制的matlab实现

[复制链接]

出0入0汤圆

发表于 2015-3-17 19:52:47 | 显示全部楼层 |阅读模式
这两天看了模糊控制,初步了解了模糊控制的思想,下面附上一个Matlab上的模糊自适应PID程序
  1. clc;
  2. clear;
  3. a = newfis('fuzzypid'); % 新建模糊推理系统  名称是fuzzypid
  4. % 设置输入e的范围、隶属度函数;
  5. a = addvar(a,'input','e',[-3 3]);   % 变量的范围 类型
  6. a = addmf(a,'input',1,'NB','zmf',[-3 -1]);      % NB
  7. a = addmf(a,'input',1,'NM','trimf',[-3 -2 0]);  % NM
  8. a = addmf(a,'input',1,'NS','trimf',[-3 -1 1]);  % NS
  9. a = addmf(a,'input',1,'Z','trimf',[-2 0 2]);    % Z
  10. a = addmf(a,'input',1,'PS','trimf',[-1 1 3]);   % PS
  11. a = addmf(a,'input',1,'PM','trimf',[0 2 3]);    % PM
  12. a = addmf(a,'input',1,'PB','smf',[1 3]);        % PB
  13. %figure(1);
  14. % subplot(5,1,1);
  15. % plotmf(a,'input',1);    % 绘制给定变量的所有隶属的曲线

  16. % 设置输入ec的范围、隶属度函数;
  17. a = addvar(a,'input','ec',[-3 3]);   % 变量的范围 类型
  18. a = addmf(a,'input',2,'NB','zmf',[-3 -1]);      % NB
  19. a = addmf(a,'input',2,'NM','trimf',[-3 -2 0]);  % NM
  20. a = addmf(a,'input',2,'NS','trimf',[-3 -1 1]);  % NS
  21. a = addmf(a,'input',2,'Z','trimf',[-2 0 2]);    % Z
  22. a = addmf(a,'input',2,'PS','trimf',[-1 1 3]);   % PS
  23. a = addmf(a,'input',2,'PM','trimf',[0 2 3]);    % PM
  24. a = addmf(a,'input',2,'PB','smf',[1 3]);        % PB
  25. %figure(2);
  26. % subplot(5,1,2);
  27. % plotmf(a,'input',2);    % 绘制给定变量的所有隶属的曲线

  28. % 设置输出Kp的范围、隶属度函数;
  29. a = addvar(a,'output','Kp',[-0.3 0.3]);   % 变量的范围 类型
  30. a = addmf(a,'output',1,'NB','zmf',[-0.3 -0.1]);      % NB
  31. a = addmf(a,'output',1,'NM','trimf',[-0.3 -0.2 0]);  % NM
  32. a = addmf(a,'output',1,'NS','trimf',[-0.3 -0.1 0.1]);  % NS
  33. a = addmf(a,'output',1,'Z','trimf',[-0.2 0 0.2]);    % Z
  34. a = addmf(a,'output',1,'PS','trimf',[-0.1 0.1 0.3]);   % PS
  35. a = addmf(a,'output',1,'PM','trimf',[0 0.2 0.3]);    % PM
  36. a = addmf(a,'output',1,'PB','smf',[0.1 0.3]);        % PB
  37. %figure(3);
  38. % subplot(5,1,3);
  39. % plotmf(a,'output',1);    % 绘制给定变量的所有隶属的曲线

  40. % 设置输出Ki的范围、隶属度函数;
  41. a = addvar(a,'output','Ki',[-0.06 0.06]);   % 变量的范围 类型
  42. a = addmf(a,'output',2,'NB','zmf',[-0.06 -0.02]);      % NB
  43. a = addmf(a,'output',2,'NM','trimf',[-0.06 -0.04 0]);  % NM
  44. a = addmf(a,'output',2,'NS','trimf',[-0.06 -0.02 0.02]);  % NS
  45. a = addmf(a,'output',2,'Z','trimf',[-0.04 0 0.04]);    % Z
  46. a = addmf(a,'output',2,'PS','trimf',[-0.02 0.02 0.06]);   % PS
  47. a = addmf(a,'output',2,'PM','trimf',[0 0.04 0.06]);    % PM
  48. a = addmf(a,'output',2,'PB','smf',[0.02 0.06]);        % PB
  49. %figure(4);
  50. % subplot(5,1,4);
  51. % plotmf(a,'output',2);    % 绘制给定变量的所有隶属的曲线

  52. % 设置输出Kd的范围、隶属度函数;
  53. a = addvar(a,'output','Kd',[-3 3]);   % 变量的范围 类型
  54. a = addmf(a,'output',3,'NB','zmf',[-3 -1]);      % NB
  55. a = addmf(a,'output',3,'NM','trimf',[-3 -2 0]);  % NM
  56. a = addmf(a,'output',3,'NS','trimf',[-3 -1 1]);  % NS
  57. a = addmf(a,'output',3,'Z','trimf',[-2 0 2]);    % Z
  58. a = addmf(a,'output',3,'PS','trimf',[-1 1 3]);   % PS
  59. a = addmf(a,'output',3,'PM','trimf',[0 2 3]);    % PM
  60. a = addmf(a,'output',3,'PB','smf',[1 3]);        % PB
  61. %figure(5);
  62. % subplot(5,1,5);
  63. % plotmf(a,'output',3);    % 绘制给定变量的所有隶属的曲线

  64. % 设置模糊规则
  65. rulelist = [ % e  ec  Kp  Ki  Kd   important   and/or
  66.     1 1 7 1 5 1 1;
  67.     1 2 7 1 3 1 1;
  68.     1 3 6 2 1 1 1;
  69.     1 4 6 2 1 1 1;
  70.     1 5 5 3 1 1 1 ;
  71.     1 6 4 4 2 1 1;
  72.     1 7 4 4 5 1 1;
  73.     2 1 7 1 5 1 1;
  74.     2 2 7 1 5 1 1;
  75.     2 3 6 2 1 1 1;
  76.     2 4 5 3 2 1 1;
  77.     2 5 5 3 2 1 1;
  78.     2 6 4 4 3 1 1;
  79.     2 7 3 4 4 1 1;
  80.     3 1 6 1 4 1 1;
  81.     3 2 6 2 3 1 1;
  82.     3 3 6 3 2 1 1;
  83.     3 4 5 3 2 1 1;
  84.     3 5 4 4 3 1 1;
  85.     3 6 3 5 3 1 1;
  86.     3 7 3 5 4 1 1;
  87.     4 1 6 2 4 1 1;
  88.     4 2 6 2 3 1 1;
  89.     4 3 5 3 3 1 1;
  90.     4 4 4 4 3 1 1;
  91.     4 5 3 5 3 1 1;
  92.     4 6 2 6 3 1 1;
  93.     4 7 2 6 4 1 1;
  94.     5 1 5 2 4 1 1;
  95.     5 2 5 3 4 1 1;
  96.     5 3 4 4 4 1 1;
  97.     5 4 3 5 4 1 1;
  98.     5 5 3 5 4 1 1;
  99.     5 6 2 6 4 1 1;
  100.     5 7 2 7 4 1 1;
  101.     6 1 5 4 7 1 1;
  102.     6 2 4 4 5 1 1;
  103.     6 3 3 5 5 1 1;
  104.     6 4 2 5 5 1 1;
  105.     6 5 2 6 5 1 1;
  106.     6 6 2 7 5 1 1;
  107.     6 7 1 7 7 1 1;
  108.     7 1 4 4 7 1 1;
  109.     7 2 4 4 6 1 1;
  110.     7 3 2 5 6 1 1;
  111.     7 4 2 6 6 1 1;
  112.     7 5 2 6 5 1 1;
  113.     7 6 1 7 5 1 1;
  114.     7 7 1 7 7 1 1;   
  115. ];
  116. a = addrule(a, rulelist);
  117. a = setfis(a, 'DefuzzMethod','mom'); % mom 平均最大隶属度法
  118. writefis(a,'fuzzpid');
  119. a = readfis('fuzzpid');

  120. % PID控制器设定
  121. ts = 0.001;
  122. %sys = tf(5e5,[1,80,1.5e4,0]);
  123. sys = tf(7e4,[1,30,1e5,0]);
  124. dsys = c2d(sys,ts,'tustin'); % 变连续系统为离散系统 zoh:零阶保持器 foh:一阶保持器 tustin:双先行变换
  125. [num,den]=tfdata(dsys,'v');
  126. u_1=0.0; u_2=0.0; u_3=0.0;
  127. y_1=0.0; y_2=0.0; y_3=0.0;
  128. x=[0,0,0]';
  129. error_1 = 0;
  130. e_1=0.0; ec_1=0.0;
  131. kp0=0.4; kd0=1.0; ki0=0.0;
  132. for k=1:1:500
  133.     time(k)=k*ts;
  134.     rin(k)=1;
  135.     k_pid = evalfis([e_1,ec_1],a); % 模糊得到pid
  136.     kp(k) = kp0 + k_pid(1);
  137.     ki(k) = ki0 + k_pid(2);
  138.     kd(k) = kd0 + k_pid(3);
  139.     u(k) = kp(k)*x(1) + kd(k)*x(2) + ki(k)*x(3);
  140.     % 在t=0.35s处增加干扰(在无干扰时此处可省略)
  141.     if k==350
  142.         u(k)=u(k)+1.5;
  143.     end
  144.     if u(k)>=10
  145.         u(k)=10;
  146.     end
  147.     if u(k)<=-10
  148.         u(k)=10;
  149.     end
  150.     yout(k)=-den(2)*y_1-den(3)*y_2-den(4)*y_3+num(1)*u(k)+num(2)*u_1+num(3)*u_2+num(4)*u_3;
  151.     error(k)=rin(k)-yout(k);
  152.     % 返回PID参数
  153.     u_3 = u_2;
  154.     u_2 = u_1;
  155.     u_1 = u(k);
  156.     y_3 = y_2;
  157.     y_2 = y_1;
  158.     y_1 = yout(k);
  159.     x(1) = error(k);
  160.     x(2) = error(k)-error_1;
  161.     x(3) = x(3)+error(k);
  162.     e_1=x(1);
  163.     ec_1=x(2);
  164.     error_2=error_1;
  165.     error_1=error(k);
  166. end
  167. figure(1);
  168. plot(time,rin,'b',time,yout,'r');
  169. xlabel('time(s)'); ylabel('rin, yout');
  170. figure(2);
  171. plot(time,error);
  172. xlabel('time(s)'); ylabel('error');
  173. figure(3);
  174. plot(time,kp);
  175. xlabel('time(s)'); ylabel('kp');
  176. figure(4);
  177. plot(time,ki);
  178. xlabel('time(s)'); ylabel('ki');
  179. figure(5);
  180. plot(time,kd);
  181. xlabel('time(s)'); ylabel('kd');
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2015-4-13 13:45:03 | 显示全部楼层
翻译成C看看

出0入0汤圆

发表于 2015-7-25 00:27:40 | 显示全部楼层
666666666666666666666

出0入0汤圆

发表于 2015-7-25 08:38:43 | 显示全部楼层
简单看来,模糊控制,就是“经验数据差表”

出0入0汤圆

发表于 2015-7-25 08:40:19 | 显示全部楼层
可惜不是C语言的。。。

出0入0汤圆

发表于 2015-7-29 19:09:35 | 显示全部楼层
感觉模糊控制的规则设置起来也是件困难事。。。

出0入0汤圆

发表于 2015-10-6 21:46:53 | 显示全部楼层
最近也在做这个,我拿去研究下~

出0入0汤圆

发表于 2015-10-8 21:35:54 | 显示全部楼层
好厉害,谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 13:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表