本篇对教材第二章到第五章的所有 MATLAB 例题进行了整理。部分代码与例题中的有所修改更正,并重新格式化。
第二章 微分方程与传递函数
例题1 绘制零-极点分布图
有一闭环控制系统,其传递函数为
Gb(s)=s3+2s2+3s+12s2+5s+1
,要求绘制其零-极点分布图。
1 2 3 4 5 6
| num = [2, 5, 1]; den = [1, 2, 3, 1]; pzmap(num, den); sys = tf(num, den); z = tzero(sys); p = pole(sys);
|
TODO 图表
第三章 频率特性
例题1 绘制奈奎斯特图(使用 plot
)
有一系统传递函数为
G(s)=s2+2ζωns+ωn2ωn2
,试画出该系统在不同阻尼比情况下的 Nyquist 图。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| wn = 1; zeta = [0.1:0.1:1, 2]; w = logspace(-1, 1, 100); X = zeros(length(w), length(zeta)); Y = zeros(length(w), length(zeta));
for i = 1:length(zeta) dd = wn^4 + w.^4 + 2 * (2 * zeta(i)^2 -1) * wn^2 * w.^2; x = wn^2 * (wn^2 - w.^2) ./ dd; y = -2 * zeta(i) * wn^3 * w ./ dd; X(:, i) = x; Y(:, i) = y; end
plot(X, Y, '-k') axis('square') grid on; xlabel('Real Axis') ylabel('Imaginary Axis')
|
例题2 绘制奈奎斯特图(使用 nyquist
)
有一系统的开环传递函数
G(s)=(s+1)(s+2)(s+5)1000
,试画出其奈奎斯特图。
1 2 3 4
| G = tf(1000, conv([1, 1], conv([1, 2], [1, 5]))); nyquist(G, '-k')
grid on
|
例题3 绘制奈奎斯特图(使用 nyquist
)
已知某系统的开环传递函数为
G(s)=s(3s+1)10
,试绘制其奈奎斯特图。
1 2 3
| num = 10; den = [3, 1, 0]; nyquist(num, den, '-k')
|
例题4 绘制波德图(使用 subplot
)
传递函数为
G(s)=s2+2ζωns+ωn2ωn2
的二阶系统,试用 MATLAB 语言画出其波德图。
经计算可得其幅频特性和相频特性分别为
A(ω)=(ωn2−ω2)2+4ζωn2ω2ωn2
φ(ω)=−arctan(ωn2−ω22ζωnω)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| wn = 1; zetas = [0:0.25:1, 2, 3, 5]; w = logspace(-1, 1, 100); mm = zeros(length(w), length(zetas)); pp = zeros(length(w), length(zetas));
for i = 1:length(zetas) m = wn^2 ./ sqrt((wn^2 - w.^2).^2 + 4 * zetas(i)^2 * wn^2 * w.^2); p = atan2(-2 * zetas(i) * wn * w, wn^2 - w.^2); pp(:, i) = 180 * p' / pi; mm(:, i) = 20 * log10(m'); end
subplot(2, 1, 1) semilogx(w, mm) grid on ylabel('增益/dB') title('不同 \zeta 下的二阶系统的波德图')
subplot(2, 1, 2) semilogx(w, pp) grid on ylabel('相角/(^{\circ})') xlabel('频率/(rad/sec)')
|
例题5 绘制波德图(使用 bode
)
用 MATLAB 语言绘制传递函数为
G(s)=(2.5s+1)(0.025s+1)3(0.5s+1)
的系统的波德图。
1 2 3
| G = tf(3 * [0.5, 1], conv([2.5, 1], [0.025, 1])); bode(G, '-k') grid on
|
例题6 绘制波德图(使用 bode
)
绘制传递函数为
G(s)=s(1+0.5s)(1+0.012s+0.0004s2)5(1+0.1s)
的系统的波德图。
1 2 3
| G = tf(5 * [0.1, 1], conv([1, 0], conv([0.5, 1], [0.0004, 0.012, 1]))); bode(G, '-k') grid on
|
第四章 控制系统的稳定性分析
例题1 判别系统稳定性
系统的传递函数为
G(s)=s4+10s3+25s2+40s+25s3+5s2+20s+20
试用 MATLAB语言编程判别系统的稳定性。
1 2 3 4
| G = tf([1, 5, 20, 20], [1, 10, 25, 40, 25]); roots(G.den{1})
|
例题2 求幅值裕量、相位裕量(margin
)
设控制系统的开环传递函数为
G(s)H(s)=s(s+1)(s+5)k
当 k=10,k=100 时,判断系统是否稳定?求系统的幅值裕量 Kg 和相位裕量 γ
解:
由 G(s)H(s)=s(s+1)(s+5)k 的分母可知该系统开环稳定,将其化为标准环节的形式
G(s)H(s)=s(s+1)(5s+1)K
当 k=10 时,程序如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| GH = tf(10, conv([1, 0], conv([1, 1], [1, 5]))); sys = feedback(GH, 1);
p = pole(sys); z = tzero(sys);
n1 = length(find(real(p) > 0)); n2 = length(find(real(z) > 0));
if (n1 > 0) disp('系统不稳定!'); else disp('系统稳定!'); end
if (n2 > 0) disp('系统不是最小相位系统!'); end
[Gm, Pm, Wcg, Wcp] = margin(GH); PGm = num2str(20 * log10(Gm)); PPm = num2str(Pm); disp(['系统的幅值裕量为 ', PGm]); disp(['系统的相位裕量为 ', PPm]);
margin(GH)
|
第五章 控制系统的时间响应及稳态误差分析
例1 绘制二阶闭环系统在不同阻尼比下的阶跃响应曲线
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
wn = 1; zetas = [0:0.25:1, 2, 3, 5]; t = 0:0.1:12;
yy = zeros(length(zetas), length(t));
for i = 1:length(zetas) z = zetas(i);
if z == 0 y = 1 - cos(wn * t); elseif (z > 0 && z < 1) wd = wn * sqrt(1 - z^2); th = atan(sqrt(1 - z^2) / z); y = 1 - exp(-z * wn * t) .* sin(wd * t + th) / sqrt(1 - z^2); elseif z == 1 y = 1 - (1 + wn * t) .* exp(-wn * t); elseif z > 1 lam1 = -z - sqrt(z^2 - 1); lam2 = -z + sqrt(z^2 - 1); y = 1 - 0.5 * wn * (exp(lam1 * t) / lam1 - exp(lam2 * t) / lam2) / sqrt(z^2 - 1);
end
yy(i, :) = y; end
plot(t, yy) title('二阶闭环系统在不同阻尼比下的阶跃响应') xlabel('t') ylabel('x_o(t)') grid on
|
例题2 绘制系统的阶跃响应曲线
系统传递函数为
G(s)=s2+0.4s+11
试绘制该系统的阶跃响应曲线。
1 2 3 4
| num = 1; den = [1, 0.4, 1]; G = tf(num, den); step(G)
|
例题3 电机调速
TODO