一个经验记录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语言中的常见问题了,不再多说。

posted @ 2023-06-10 17:17  叕叒双又  阅读(98)  评论(0编辑  收藏  举报