ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

MATLAB传递函数图绘制:Bode、Nyquist、Nichols三图详解与避坑指南

MATLAB传递函数图绘制:Bode、Nyquist、Nichols三图详解与避坑指南

简介:这份资源面向控制系统学习者和MATLAB/Simulink入门用户,聚焦如何在MATLAB环境中绘制S平面上的三维传递函数图,帮助理解动态系统的频率响应与稳定性分析。内容涉及传递函数建模、S平面极点零点分布、tf函数用法以及利用bode、freqresp配合surf、meshgrid生成3D曲面图等关键知识点,适合作为控制系统仿真与可视化练习的参考脚本。压缩包共2个文件,包含1个m脚本和1个txt说明,整体约2KB,其中m文件用于实现传递函数定义、频率范围设置、响应计算与三维绘图流程,txt文件提供许可相关信息。目前已有1819人学习下载,读者可借助脚本快速复现S平面传递函数可视化过程,对照代码理解从模型建立到图形输出的完整思路,并在此基础上修改参数、扩展分析,用于课程设计或系统性能评估。

1. 传递函数图在 MATLAB 里到底画的是什么

很多人第一次听到「3 传递函数图」,以为是三条曲线叠在一张图上。实际做过控制仿真的人知道,它通常指三类图:Bode 图、Nyquist 图、Nichols 图,或者指一个系统里三个环节(前向通道、反馈通道、扰动通道)的传递函数分别画出来对比。标题里的「3」到底是数量还是类型,取决于你手上的模型结构。我一般先问一句:你是要看频域响应,还是要看三个子系统各自的动态?前者用bode、nyquist、nichols三件套,后者用tf数组加循环画图。这篇笔记按「一个闭环系统拆成三个传递函数,再分别画频域图」这条线走,因为它覆盖了大多数工程场景:控制器、被控对象、传感器各画一张,或者开环、闭环、误差传递函数各画一张。MATLAB 的 Control System Toolbox 把这件事做得足够顺手,但顺手不等于不出错,下面把选型、代码、参数和翻车点一次讲清。

2. 三个传递函数怎么建、怎么连、怎么画

2.1 用 tf 建模型:分子分母系数别填反

MATLAB 里建传递函数最直接的是tf(num, den),num和den都是按 s 的降幂排列的系数向量。新手最容易翻车的地方是:从微分方程写系数时把阶次搞乱,或者忘了补零。比如G(s) = 10/(s^2 + 2s + 10),分母是[1 2 10],分子是[10]。如果写成tf([10],[1 2 10])没问题,但有人写成tf(10,[1,2,10])也能跑,因为 MATLAB 会自动补。真正会出事的是分子有 s 项时,比如(s+5)/(s^2+3s+2),分子必须写[1 5],不能只写5,否则就变成常数 5 了。

% 三个环节:控制器 C、被控对象 P、传感器 H s = tf('s'); % 用 s 变量建模型,可读性最好 C = 2 + 1/s; % PI 控制器,注意 1/s 表示积分 P = 10/(s^2 + 2*s + 10); % 二阶被控对象 H = 1/(0.1*s + 1); % 一阶传感器动态 % 检查三个模型是否都建对了 disp(C); disp(P); disp(H);

用s = tf('s')的好处是模型表达式和纸面公式几乎一致,不容易把系数填反。代价是当阶次很高时,tf的字符串解析会慢一点,但工程上三五个环节完全无所谓。C = 2 + 1/s这种写法比tf([2 1],[1 0])直观得多,后者需要你手动把2 + 1/s通分成(2s+1)/s,系数是[2 1]和[1 0],稍不留神就写成[1 0]和[2 1]。

2.2 用 feedback 和 series 搭闭环:正负反馈别搞反

三个环节搭成闭环,常见结构是前向通道C*P,反馈通道H,闭环传递函数T = (C*P)/(1 + C*P*H)。MATLAB 里用feedback最稳:

L = C * P; % 开环传递函数 T = feedback(L, H); % 闭环,默认负反馈 S = 1 - T; % 灵敏度/误差传递函数

feedback(L, H)默认是负反馈,即L/(1+L*H)。如果你要正反馈,得写feedback(L, H, +1)。这个+1很多人不知道,结果画出来的闭环 Bode 图跟理论对不上,还以为是模型建错了。另一个坑是series和*的区别:series(C, P)和C*P在单输入单输出下等价,但series可以指定输入输出通道,MIMO 时更明确。SISO 场景我一般直接用*,少一层函数嵌套。

三个传递函数建好后,画图有两种方式:一是bode(C, P, H)一次画三条,MATLAB 会自动用不同颜色区分;二是分别画再hold on。前者更省事,但图例需要手动加。

figure; bode(C, P, H); legend('控制器 C', '被控对象 P', '传感器 H'); grid on;

bode不加输出参数时直接画图,加了输出参数[mag, phase, w] = bode(...)就只返回数据不画图。这个区别在批量处理时很关键:如果你在循环里调bode又想要数据,不加输出参数会弹出几十个图窗,机器直接卡死。

2.3 画 Nyquist 和 Nichols:频率范围要手动卡

Bode 图默认频率范围是自动选的,Nyquist 和 Nichols 也是,但自动范围经常不够用。比如一个高增益系统,Nyquist 曲线在低频段绕了很多圈,自动范围可能只画出一小段,看起来像没包围原点,实际是包围了。这时候要手动指定频率向量:

w = logspace(-2, 3, 500); % 从 0.01 到 1000 rad/s,500 个点 figure; nyquist(L, w); grid on; figure; nichols(L, w); grid on;

logspace(-2, 3, 500)生成对数等距的频率点,-2是 10 的 -2 次方,3是 10 的 3 次方。点数 500 是经验值:太少曲线有棱角,太多画图慢。Nyquist 图看的是包围圈数,Nichols 图看的是增益裕度和相位裕度,两者对频率范围都比 Bode 敏感。我一般先用margin(L)拿到裕度,再根据裕度对应的频率去定w的范围。

[Gm, Pm, Wcg, Wcp] = margin(L); fprintf('增益裕度 %.2f dB at %.2f rad/s\n', 20*log10(Gm), Wcg); fprintf('相位裕度 %.2f deg at %.2f rad/s\n', Pm, Wcp);

margin返回的Gm是绝对值,转 dB 要20*log10(Gm)。Wcg是相位穿越频率,Wcp是增益穿越频率。这两个频率决定了你画 Nyquist 时w的下限和上限该取多少:下限至少比Wcg小两个数量级,上限至少比Wcp大两个数量级,否则关键频段被截掉,图就白画了。

3. 三个传递函数图的参数怎么调才不误导

3.1 Bode 图的幅值单位:dB 还是绝对值

bode默认幅值用 dB,相位用度。有人习惯看绝对值,可以用bodeplot加magunits参数:

h = bodeplot(C, P, H); setoptions(h, 'MagUnits', 'abs', 'PhaseUnits', 'deg');

MagUnits可选'dB'或'abs',PhaseUnits可选'deg'或'rad'。工程上相位裕度习惯用度,所以相位一般不动。幅值用 dB 的好处是乘性关系变加性,三个环节串联时总幅值等于三条曲线相加,看图就能估。用绝对值则更接近物理量纲,看传感器噪声底时更直观。我一般交付给做频域整定的人用 dB,交付给做信号链预算的人用绝对值。

3.2 Nyquist 图的箭头方向:顺时针还是逆时针

Nyquist 稳定判据里,包围方向决定系统稳定性。MATLAB 默认不画箭头,你得自己加:

figure; nyquist(L, w); hold on; % 在曲线上每隔一段加一个箭头 [re, im] = nyquist(L, w); re = squeeze(re); im = squeeze(im); idx = 1:50:length(w); quiver(re(idx), im(idx), ... [0 diff(re(idx))], [0 diff(im(idx))], 0, 'r');

squeeze是因为nyquist返回的re和im是三维数组,维度是1 x 1 x N。quiver画箭头,0表示不自动缩放。这段代码不优雅但管用。更省事的办法是用nyquistplot加ShowFullContour选项,但箭头方向还是得自己判断。血泪经验:方向搞反,稳定判据的结论就完全相反,所以画完一定要对照margin的结果交叉验证。

3.3 Nichols 图的网格:等 M 圆和等 N 圆

Nichols 图上的网格线是等闭环幅值线和等闭环相位线,MATLAB 默认不画。要画得用ngrid:

figure; nichols(L, w); ngrid;

ngrid画的是等 M 圆和等 N 圆,用来读闭环频率响应。注意ngrid只对 Nichols 图有效,Bode 和 Nyquist 上调用会报错。另外ngrid画的网格是基于单位反馈的,如果你的系统不是单位反馈,网格读数要修正。我一般只在单位反馈时用ngrid,非单位反馈就直接用feedback算出闭环再画 Bode。

4. 避坑:三个传递函数图最容易翻车的五个地方

现象一:Bode 图三条曲线颜色一样,分不清哪条是哪条。原因:bode(C, P, H)在旧版本 MATLAB 里可能只用一个颜色循环,或者你hold on之后又调了bode导致颜色重置。解决:显式指定颜色,或者用bodeplot返回句柄后setoptions统一设。更稳的办法是分别画,每次hold on前记下当前颜色顺序。

现象二:Nyquist 图看起来包围了 -1 点,但margin说稳定。原因:频率范围不够,曲线在低频段没画全,视觉上的包围是假象。解决:用logspace把下限拉到Wcg/100以下,重新画。如果还是包围,检查feedback的正负号是不是写反了。

现象三:三个传递函数里有一个是离散的,画图报错。原因:bode对离散模型默认画到奈奎斯特频率,但如果采样时间没设对,频率轴会怪。解决:用d2c转连续再画,或者bode时指定w范围不超过pi/Ts。离散模型画 Bode 我一般先d2c(G, 'tustin'),图更接近连续域直觉。

现象四:margin返回的Gm是Inf,增益裕度读不出来。原因:相位曲线没穿过 -180 度,系统是一阶或过阻尼,理论上增益裕度无穷大。解决:这不是错误,是系统特性。如果非要看,把频率范围拉宽,看相位是不是趋近 -180 但不到。趋近的话Gm会很大但不是Inf。

现象五:三个传递函数画在同一张图上,但量纲差太多,小的那条被压成一条线。原因:比如控制器增益 100,传感器增益 0.001,同轴显示时小的看不见。解决:用bodeplot加XlimMode和YlimMode手动设,或者分开画三张子图subplot(3,1,1)。我一般交付时用子图,自己看时用同轴加legend。

5. 从三个图到一张图:用 subplot 和 tiledlayout 做对比面板

最后一章讲一个具体技巧:把三个传递函数的 Bode、Nyquist、Nichols 拼成 3x3 面板,一眼看全。subplot是老办法,tiledlayout是新办法,后者对间距和共享轴的控制更好。

figure; t = tiledlayout(3, 3, 'TileSpacing', 'compact'); % 第一行:Bode nexttile; bode(C); title('C Bode'); grid on; nexttile; bode(P); title('P Bode'); grid on; nexttile; bode(H); title('H Bode'); grid on; % 第二行:Nyquist nexttile; nyquist(C, w); title('C Nyquist'); grid on; nexttile; nyquist(P, w); title('P Nyquist'); grid on; nexttile; nyquist(H, w); title('H Nyquist'); grid on; % 第三行:Nichols nexttile; nichols(C, w); ngrid; title('C Nichols'); nexttile; nichols(P, w); ngrid; title('P Nichols'); nexttile; nichols(H, w); ngrid; title('H Nichols'); title(t, '三个传递函数频域对比');

tiledlayout(3,3)建 3x3 网格,nexttile按行优先顺序填。TileSpacing设'compact'减少留白。title(t, ...)给整个面板加总标题。这段代码跑完,三个环节的九张图一次出全,适合写报告或做设计评审。

参数上唯一要调的是w:三个环节的频段可能差很多,比如控制器带宽 100 rad/s,传感器带宽 0.1 rad/s,用同一个w画 Nichols 时,传感器那条可能只占图上一小角。我的习惯是每个环节单独定w,用logspace(log10(0.1*Wcp), log10(10*Wcp), 300),Wcp是该环节的穿越频率。这样每张图的横轴都落在有效频段,不会浪费画布。

验证方法:画完面板后,用margin分别算三个环节的裕度,和图上读出来的值对一遍。如果图上读的相位裕度和margin返回的差超过 5 度,说明频率范围或网格有问题,回去调w。这个交叉验证我每次都做,因为 Nyquist 和 Nichols 的视觉读数很容易被频率范围带偏。

最后说个习惯:我建完三个传递函数后,第一件事不是画图,而是pole和zero各看一遍。如果某个环节有右半平面极点,Bode 图的相位曲线会从 +180 度往下走,和最小相位系统的 -90 度起步完全不同。这个特征在 Nyquist 图上表现为曲线从第三象限出发,不先看极点零点,画完图容易误判稳定性。希望帮到你。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进