源代码:
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]
输出波形如下:
发现系统并不稳定,单位阶跃响应是发散的,还有进一步优化的空间。
标签:maxY,系统优化,sysGz,NaN,PID,解决方案,tf,sysY,sysG From: https://www.cnblogs.com/guochaoxxl/p/18339757