一、判断系统稳定性的方法,并举例说明。
方法一:用 Nyquist 稳定判据判断系统的稳定性
Nyquist 稳定判据:若想使得闭环系统稳定,则开环系统 G(S)H(S)的
Nyquist 曲线逆时针绕临界点(-1,j0)点的圈数 R 必需等于 G(S)H(S)(系
统的开环传函)位于 S 的右半平面开环极点数 P。
即:Z=P-R
Z=0 稳定;
Z≠0 不稳定,Z 为闭环正实部根的个数。
方法二:用 Bode 图判断系统的稳定性
函数调用格式为:margin( )或[Gm Pm wcp wcg]=margin(G)
对于最小相位系统:
当相角裕度 Pm(γ)>0o 或幅值裕度 Gm(h) >1 时,表示系统稳定
当相角裕度 Pm(γ)<0o 或幅值裕度 Gm(h) <1 时,表示系统不稳定
幅值裕度 Gm(h)、相角裕度 Pm(γ)越大,系统稳定程度越好。在使用时,Gm(h)、
Pm(γ)是成对使用的,有时仅使用一个裕度指标 Pm(γ)。
方法三:用代数稳定判据法判断系统的稳定性
(1)系统数学模型为传递函数形式 G(S)=tf(num,den):
执行语句:roots(G.den{1});
注:“{}”表示维数
(2)系统数学模型为零极点增益形式 G(S)=zpk(z,p,k);
执行语句:G.p{1};
(3)系统数学模型为状态空间形式 G(S)=ss(A,B,C,D);
执行语句:eig(G.A);
注:eig()表示计算系统的极点
方法四:用根轨迹法判断系统的稳定性
若根轨迹在参数取值过程中,部分在左半平面,部分在右半平面,则系统的稳
定性与可变参数的取值有关。函数命令调用格式:[k poles]=rlocfind(G)
方法五:用单位阶跃响应曲线判定系统稳定性
例:已知系统的开环传函为:
5(S+2)
G(S)=
----------------------------
(S+10)(S³+3S²+2S+5)
判断系统的稳定性
解:方法一:用 Nyquist 稳定判据判断系统的稳定性
>>G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>>roots(G.den{1})
Ans=
-10.0000
-2.9042
-0.0479+1.3112i
-0.0479-1.3112i
>>nyquist(G)
执行以上程序得到 nyquist 图可以看出,nyquist 曲线包围临界点的圈数
R=0。所以 Z=P-R=0,系统稳定。
>> roots(G.den{1})
ans =
0.5000 + 2.9580i
0.5000 - 2.9580i
-1.0000
执行以上语句得到的结果可知,开环传递函数在右半 S 平面极点个数 P=2。
所以 Z=P-R=0,系统稳定。
验证:
>> sys=feedback(G,1);
>> roots(sys.den{1})
ans =
-10.0553
-2.8424
-0.0512+1.4480i
-0.0512-1.4480i
闭环系统特征根均为负实部,故系统稳定
方法二:用 Bode 图判断系统的稳定性
>>G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>>[Gm Pm Wcp Wcg]=margin(G)
执行上述指令得
Gm =
10.5949
Pm =
22.6956
Wcp =
2.4490
Wcg =
1.4393
可以看出相角裕度 Pm=22.6956>0,所以系统是稳定的
>>margin(G)
得到 bode 图,图中性能指标与上述结果一样
方法三:用代数稳定判据法判断系统的稳定性
(1) 执行语句:roots(G.den{1})
>>G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>>G1=feedback(G,1);
>>roots(G.den{1})
ans =
-10.0000
-2.9042
-0.0479 + 1.3112i
-0.0479 - 1.3112i
因为系统闭环极点全为负实部,故系统稳定
(2) 执行语句:G.p{1}
>>G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>> G1=feedback(G,1);
>> G2=zpk(G1);
>> G2.P{1}
ans =
-10.0000
-2.9042
-0.0479 + 1.3112i
-0.0479 - 1.3112i
因为系统闭环极点全为负实部,故系统稳定
(2) 执行语句:eig(G.A)
>> G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>>
G1=feedback(G,1);
>> G2=ss(G);
>> eig(G2.a)
ans =
-10.0000
-2.9042
-0.0479 + 1.3112i
-0.0479 - 1.3112i
因为系统闭环极点全为负实部,故系统稳定
方法四:用根轨迹法判断系统的稳定性
>> G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>> rlocus(G)
>> [k poles]=rlocfind(G)
Select a point in the graphics window
selected_point =
-0.0000 + 1.4286i
k =
0.9239
poles =
-10.0511
-2.8469
-0.0510 + 1.4379i
-0.0510 - 1.4379i
由 k 值可知系统是稳定的
方法五:用单位阶跃响应曲线判定系统稳定性
>> G=tf(5*[1 2],conv([1 10],[1 3 2 5]));
>> rlocus(G);
>> G=feedback(G,1);
>> step(G)
由图可知系统稳定
二、查阅相关书籍或上网搜索,找出一个运用 MATLAB 制作的动画,要求有程序
说明和必要的文字注释;
碰球动画
figure(1);%定义函数
axis([-5.1,5,-0.05,1.05]);%绘制二维图形
hold on;%保持当前图形及轴系所有的特性
axis('off');%覆盖坐标刻度,并填充背景
%通过填充绘出台阶及两边的挡板
fill([-5.1,-5,-5,-5.1],[-0.05,-0.05,1.05,1.05],[0,0.5,0]);
fill([4.12,4.22,4.22,4.12],[-0.05,-0.05,1.05,1.05],[0,0.5,0]);
fill([-5,-3.2,-3.2,-5],[-0.05,-0.05,0,0],[0,0.5,0]);
fill([-3.2,-2.8,-2.8,-3.2],[-0.05,-0.05,0.2,0.2],[0,0.5,0]);
fill([-3.2,-1.4,-1.4,-3.2],[0.2,0.2,0.25,0.25],[0,0.5,0]);
fill([-1.4,-1,-1,-1.4],[0.2,0.2,0.45,0.45],[0,0.5,0]);
fill([-1.4,0.4,0.4,-1.4],[0.45,0.45,0.5,0.5],[0,0.5,0]);
fill([0.4,0.8,0.8,0.4],[0.45,0.45,0.7,0.7],[0,0.5,0]);
fill([0.4,2.0,2.0,0.4],[0.7,0.7,0.75,0.75],[0,0.5,0]);
fill([2.0,2.3,2.3,2.0],[-0.05,-0.05,0.75,0.75],[0,0.5,0]);
fill([2.3,4.12,4.12,2.3],[-0.05,-0.05,0,0],[0,0.5,0]);
%x1=line([-5,5],[0,0],'color','g','linestyle','-',
'markersize',50)%设置台阶边框线,颜色,擦试方式
%x2=line([-5,5],[0.25,0.25],'color','g','linestyle','-',
'markersize',50)%设置台阶边框线,颜色,擦试方式
%line([-5,5],[0.5,0.5],'color','b','linestyle','-',
'markersize',50)%设置球与地面接触面的颜色,擦试方式
%line([-5,5],[0.75,0.75],'color','b','linestyle','-',
'markersize',50)%设置球与地面接触面的颜色,擦试方式
head=line(-5,1,'color','r','linestyle','.','erasemode','xor',
'markersize',60);%设置小球颜色,大小,线条和擦试方式
%body=line(-5,1,'color','b','linestyle','-','erasemode','none');
%描绘轨迹线
%设置初始条件
t=-5;
dt=0.001;
w=0;
dw=0.001;
while 1 %设置球跳到第一台阶的范围和高度
while t<=-4
t=dt+t;
if w<=1
w=dw+w;
else
end
w=-1;
y=-w*w+1;
set(head,'xdata',t,'ydata',y);%设置球的运动
%set(body,'xdata',t,'ydata',y);%描绘轨迹线
drawnow;
end %结束程序
w=-1;%设置球弹起的初始位置
%设置球跳到第二台阶的范围和高度
while t<=-2.31
t=dt+t;
if w<=1
w=dw+w;
else
end
w=-1;
y=(-w*w)/2+0.5;
set(head,'xdata',t,'ydata',y);%设置球的运动
%set(body,'xdata',t,'ydata',y);%描绘轨迹线
drawnow;
end %结束程序
w=-1;%设置球弹起的初始位置
%设置球跳到第三台阶的范围和高度
while t<=-0.62