一个经验记录matlab中disp的应用
一、题目:一个给定离散系统闭环传递函数为G1(z) = (Z^2 + 4.2Z + 5.43)/(Z^4-2.7*Z^3+0.4*Z^2 + 0.08Z + 0.002),采样周期为0.1s,绘制系统零极点分布图,并判定各系统的稳定性。
二、代码如下:
function systemStabilityJudge1() 2 num1 = [1 4.2 5.43]; 3 den1 = [1 -2.7 2.5 2.43 -0.56]; 4 G1 = tf(num1, den1, 0.1); 5 6 figure(1) 7 pzmap(G1) 8 9 disp('判断极点情况:') 10 flag = 0; 11 p1 = pole(G1) 12 r = real(p1); 13 m = real(p1); 14 for i = 1:length(p1) 15 if(sqrt(r(i).^2 + m(i).^2)) >= 1 16 flag = 1 17 % sprintf('极点为:%f\n', p1(i)) 18 disp(p1(i)) 19 end 20 end 21 if flag == 1 22 disp('系统是不稳定的!') 23 else 24 disp('系统是稳定的!') 25 end
三、说明:
1、为了方便,写个和函数,为了将来更加方便使用和修改而已
2、2 3 4行是为了生成传递函数
3、6 7行是为了画零极点图
4、第9行开始到结束,是为了判断系统是否稳定,原理就是,看极点的是否在单位圆内,模是否大于1。为了后面的提示信息的逻辑更加清晰,添加了一个标志未,如果系统不稳定就将flag设置为1。11行为了获取系统的极点,,12 13行获取极点的实部和虚部,15行来判断模是否大于1来设置flag标志。
5、特别要注意的是第18行,直接用disp输出数据更加方便,无需第17行那样各种设置,最重要的是,第17行输出的只有实部,建议不要用matlab中sprintf函数,直接用disp会更加方便。
四、为了更加方便,将上述的代码9-25行代码封装成一个函数:judgeStab.m
1 function judgeStab(sysG) 2 disp('判断极点情况:') 3 flag = 0; 4 p1 = pole(sysG) 5 r = real(p1); 6 m = real(p1); 7 for i = 1:length(p1) 8 if(sqrt(r(i).^2 + m(i).^2)) >= 1 9 flag = 1 10 % sprintf('极点为:%f\n', p1(i)) 11 disp(p1(i)) 12 end 13 end 14 if flag == 1 15 disp('系统是不稳定的!') 16 else 17 disp('系统是稳定的!') 18 end 19 end
测试函数变为,此次加了一各系统:
1 function systemStabilityJudge1() 2 num1 = [1 4.2 5.43]; 3 den1 = [1 -2.7 2.5 2.43 -0.56]; 4 G1 = tf(num1, den1, 0.1); 5 6 figure(1) 7 pzmap(G1) 8 judgeStab(G1) 9 10 num2 = [0.68 5.43]; 11 den2 = [1 -1.35 0.4 0.08 0.002]; 12 G2 = tf(num2, den2, 0.1); 13 14 figure(2) 15 pzmap(G2) 16 judgeStab(G2)
测试结果有问题,G2的零极点图表明系统是稳定的,结果函数判断是不稳定的,原来是judgeStab函数的第6行错了,改成m = imag(p1);即可,再测试正常了。这里也出现一个问题,就是对float数据,0.7451^2 + 0.7451^2=1,也是C语言中的常见问题了,不再多说。
人就像是被蒙着眼推磨的驴子,生活就像一条鞭子;当鞭子抽到你背上时,你就只能一直往前走,虽然连你也不知道要走到什么时候为止,便一直这么坚持着。