寻找PID系统优化参数问题的解决方案

源代码:
复制代码
 1 nump=[4];
 2 denp=[1 6 8 4];
 3 sysGp=tf(nump,denp);
 4 den=[1 0];
 5 t=0:0.01:8;
 6 for K=3:0.2:5
 7     for a=0.1:0.1:3
 8         num=[K 2*K*a K*a^2];
 9         sysG=tf(num,den);
10         sysGz=feedback(series(sysG,sysGp),1);
11         sysY=step(sysGz,t);
12         maxY=max(sysY);
13         if maxY<2.60 & maxY>2.55
14             plot(t,sysY);
15             grid;
16             title('Unit-Step Response');
17             xlabel('t(sec)');
18             ylabel('Output sysY');
19             solution=[K,a,maxY]
20             break
21         end
22     end
23     if maxY>2.55 & maxY<2.60
24         break;
25     end
26 end
复制代码

代码非常简单,就是对给定传递函数的系统选择合适的PID控制参数,执行后,没有做图出来,很明显说明第13行的判断条件没有成立,但是,却得到了一个solution =5.0000 3.0000 2.9784错误的结果,主要原因是,前面所有循环执行后,也没有找到满足条件的点,系统就自作聪明的把最后一个点当成是结果返回了。而条件需要满足最大值在(2.55,2.60)的范围也明显违背了。为了解决这个问题,需要对循环的条件进行修改,代码如下:

复制代码
 1 nump=[4];
 2 denp=[1 6 8 4];
 3 sysGp=tf(nump,denp);
 4 den=[1 0];
 5 t=0:0.01:8;
 6 for K=[3:0.2:5 NaN]
 7     for a=[0.1:0.1:3 NaN]
 8         num=[K 2*K*a K*a^2];
 9         sysG=tf(num,den);
10         sysGz=feedback(series(sysG,sysGp),1);
11         sysY=step(sysGz,t);
12         maxY=max(sysY);
13         if maxY<2.60 & maxY>2.55
14             plot(t,sysY);
15             grid;
16             title('Unit-Step Response');
17             xlabel('t(sec)');
18             ylabel('Output sysY');
19             %solution=[K,a,maxY]
20             break
21         end
22     end
23     if maxY>2.55 & maxY<2.60
24         break;
25     end
26 end
27 solution=[K,a,maxY]
复制代码

solution =

NaN NaN NaN

这下结果就说明没有找到满足条件的值,说明需要进一步优化。经过试错,发现修改K与a的范围,这下就可以找到满足的条件的点了。当K=(0.4,5), 便能找到满足条件的点,代码如下:

复制代码
 1 nump=[4];
 2 denp=[1 6 8 4];
 3 sysGp=tf(nump,denp);
 4 den=[1 0];
 5 t=0:0.01:8;
 6 for K=[0.4:0.2:5 NaN]
 7     for a=[0.1:0.1:3 NaN]
 8         num=[K 2*K*a K*a^2];
 9         sysG=tf(num,den);
10         sysGz=feedback(series(sysG,sysGp),1);
11         sysY=step(sysGz,t);
12         maxY=max(sysY);
13         if maxY<2.60 & maxY>2.55
14             plot(t,sysY);
15             grid;
16             title('Unit-Step Response');
17             xlabel('t(sec)');
18             ylabel('Output sysY');
19             %solution=[K,a,maxY]
20             break
21         end
22     end
23     if maxY>2.55 & maxY<2.60
24         break;
25     end
26 end
27 solution=[K,a,maxY]
复制代码

输出波形如下:

发现系统并不稳定,单位阶跃响应是发散的,还有进一步优化的空间。

 

posted @   叕叒双又  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示