ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

MATLAB传递函数图全解析:伯德图、奈奎斯特图与根轨迹的建模、绘制与读图指南

MATLAB传递函数图全解析:伯德图、奈奎斯特图与根轨迹的建模、绘制与读图指南 简介这份资源面向控制系统学习者和MATLAB/Simulink入门用户聚焦如何在MATLAB环境中绘制S平面上的三维传递函数图帮助理解动态系统的频率响应与稳定性。内容围绕传递函数建模、S平面极点零点分布、tf函数用法以及3D曲面可视化展开适合正在学习自动控制原理或需要直观观察系统频域特性的读者。压缩包共2个文件包含1个m脚本和1个txt说明整体约2KB其中m脚本用于定义传递函数、设定频率范围并计算响应txt文件提供许可相关信息。已有1819人学习下载说明该主题在基础控制仿真中具有一定关注度。通过这份资源读者可以掌握从传递函数到三维曲面图的完整实现思路理解bode、freqresp与surf等函数的配合方式并借助可视化结果分析系统在不同频率下的行为为后续系统设计与性能优化提供参考。1. 传递函数图从“能画出来”到“能讲清楚”的那道坎很多人第一次在 MATLAB 里敲完bode(tf(num, den))看到一条漂亮的幅频曲线弹出来就以为传递函数图这件事已经翻篇了。真正上手做项目才发现画出来只是起点伯德图要看截止频率和相位裕度奈奎斯特图要判断包围圈数根轨迹要读增益临界点零极点图要区分左右半平面——同一套传递函数换一张图就是换一个诊断视角。标题里的“3传递函数图”我理解成三层递进先把传递函数建模对再把三类常用图伯德、奈奎斯特、根轨迹画准最后把图上的关键参数读出来用于控制器整定。这套流程适合做控制系统、电力电子、电机驱动、过程控制的工程师也适合刚学自动控制原理、想用 MATLAB 把课本结论跑一遍的学生。下面按“建模—画图—读图—避坑—进阶”的顺序把每一步落到可复现的命令和参数上。2. 传递函数建模先把 num/den 写对再谈画图2.1 三种建模方式与适用边界MATLAB 里表示传递函数常见做法有三种系数向量、tf对象、zpk零极点增益形式。系数向量最原始num [1 2]、den [1 3 2]分别对应分子 $s2$ 和分母 $s^23s2$但向量本身不带采样时间、不带输入输出名一旦系统变复杂就容易搞混。tf对象是主力sys tf(num, den)之后可以直接sys.InputName、sys.TimeUnit还能做series、parallel、feedback运算。zpk形式在已知零极点时最省事zpk([-1], [-2 -3], 5)表示零点在 -1、极点在 -2 和 -3、增益为 5。选哪种取决于你手里有什么。从微分方程出发先写系数向量再转tf从物理参数出发比如 RLC 电路先算零极点再转zpk从实验数据出发先tfest辨识再转tf。我一般会统一转成tf对象再画图因为bode、nyquist、rlocus对tf对象的支持最完整返回的句柄也方便后续改线宽、加标注。% 方式一系数向量直接构造 num [1 2]; % 分子 s 2 den [1 3 2]; % 分母 s^2 3s 2 sys1 tf(num, den); % 方式二零极点增益形式 z [-1]; % 零点 p [-2 -3]; % 极点 k 5; % 增益 sys2 zpk(z, p, k); % 方式三由两个简单环节串联 s tf(s); % 先声明 s 变量 sys3 (s 2) / (s^2 3*s 2); % 统一转成 tf 对象方便后续画图 sys tf(sys3); disp(sys);这段代码的关键在s tf(s)这一行。很多人不知道 MATLAB 支持这种“声明式”写法结果每次都要手算多项式乘法。用s变量写出来的表达式可读性接近数学公式(s2)/(s^23*s2)一眼就能看出结构。tf(sys3)做一次类型归一化避免后面bode和nyquist因为对象类型不一致报错。参数上注意den的系数顺序是从高阶到低阶漏掉某一项要补零比如 $s^21$ 写成[1 0 1]写成[1 1]就变成 $s1$ 了这是新手最常翻车的地方。2.2 离散系统与采样时间别让 z 域和 s 域混着画如果系统是数字控制器或者采样数据传递函数要写成 z 域形式tf(num, den, Ts)第三个参数是采样时间。Ts -1表示未指定采样时间画出来的图会按连续系统处理频率轴单位是 rad/sTs 0.001表示 1 ms 采样频率轴会变成 Hz 或者归一化频率取决于你用的绘图函数。Ts 0.001; % 采样周期 1 ms num_d [0.5 0.3]; % 离散分子 den_d [1 -0.8 0.15]; % 离散分母 sys_d tf(num_d, den_d, Ts); % 离散传递函数 % 画伯德图时指定频率单位 figure; bode(sys_d, {2*pi*10, 2*pi*10000}); % 频率范围 10 Hz 到 10 kHz grid on;这里{2*pi*10, 2*pi*10000}是频率范围单位是 rad/s。很多人直接写{10, 10000}结果图只画到 10 rad/s看不到高频段。离散系统画伯德图时MATLAB 默认会做双线性变换频率轴在奈奎斯特频率附近会翘起来这是正常现象不是 bug。如果要做控制器设计建议先用c2d把连续控制器离散化再和离散被控对象串联不要混着画。2.3 从物理系统到传递函数一个 RLC 例子假设有一个串联 RLC 电路输入电压 $u$输出电容电压 $y$根据基尔霍夫定律可以写出 $\frac{Y(s)}{U(s)} \frac{1}{LCs^2 RCs 1}$。取 $L1$ mH、$C100$ μF、$R10$ Ω代入得 $LC 10^{-7}$、$RC 10^{-3}$。L 1e-3; % 1 mH C 100e-6; % 100 uF R 10; % 10 ohm num_rlc [1]; den_rlc [L*C, R*C, 1]; sys_rlc tf(num_rlc, den_rlc); % 查看自然频率和阻尼比 [wn, zeta] damp(sys_rlc); fprintf(自然频率 wn %.2f rad/s\n, wn(1)); fprintf(阻尼比 zeta %.4f\n, zeta(1));damp返回的自然频率和阻尼比是读图前的重要参考。阻尼比小于 1 说明系统有谐振峰伯德图上会在 $wn$ 附近鼓一个包阻尼比大于 1 说明过阻尼幅频曲线单调下降。知道这两个数后面看伯德图时心里就有底不会把谐振峰误当成噪声。3. 三类传递函数图的画法与读图要点3.1 伯德图幅频、相频与裕度标注伯德图是最常用的频域图bode(sys)默认画幅频和相频两张子图。要读截止频率、相位裕度、幅值裕度直接用margin(sys)更省事它会在图上标出穿越频率和裕度。figure; margin(sys_rlc); % 自动标注幅值裕度和相位裕度 grid on; % 手动获取裕度数值 [Gm, Pm, Wcg, Wcp] margin(sys_rlc); fprintf(幅值裕度 Gm %.2f dB\n, 20*log10(Gm)); fprintf(相位裕度 Pm %.2f deg\n, Pm); fprintf(相位穿越频率 Wcg %.2f rad/s\n, Wcg); fprintf(幅值穿越频率 Wcp %.2f rad/s\n, Wcp);margin返回的Gm是线性值转成 dB 要取20*log10。Pm单位是度一般要求 45° 到 60° 之间太小超调大太大响应慢。Wcp是幅频曲线穿过 0 dB 的频率也就是闭环带宽的近似值。如果Pm是负数说明系统不稳定这时候别急着调控制器先检查建模有没有把右半平面极点漏掉。画伯德图时频率范围很关键。默认范围可能太窄看不到高频衰减也可能太宽低频段挤成一团。我一般用bode(sys, {0.1, 1e6})手动指定先粗看一遍再缩范围。另外bode支持多系统对比bode(sys1, sys2, sys3)会把三条曲线画在同一张图上用不同颜色区分适合比较不同参数下的频响。3.2 奈奎斯特图包围圈数与稳定性判断奈奎斯特图把频率从 $-\infty$ 到 $\infty$ 的 $G(j\omega)$ 画在复平面上稳定性判据是 $Z N P$其中 $P$ 是开环右半平面极点数$N$ 是包围 $(-1, j0)$ 点的圈数$Z$ 是闭环右半平面极点数。nyquist(sys)画图nyquistplot可以加选项。figure; nyquist(sys_rlc); grid on; title(Nyquist Plot of RLC System); % 判断闭环稳定性 P sum(real(pole(sys_rlc)) 0); % 开环右半平面极点数 disp([开环右半平面极点数 P , num2str(P)]);对于这个 RLC 例子开环极点都在左半平面$P0$只要曲线不包围 $(-1, j0)$闭环就稳定。实际读图时要注意MATLAB 默认只画正频率部分负频率部分是对称的判断包围圈数时要脑补完整曲线。如果曲线正好穿过 $(-1, j0)$说明系统临界稳定这时候margin返回的裕度接近零需要加阻尼或者降增益。奈奎斯特图容易看花眼尤其是曲线绕来绕去的时候。我的习惯是先用margin看裕度再用nyquist确认包围关系两者对不上就回去检查传递函数有没有写错。另外nyquist支持ShowFullContour选项可以把负频率也画出来但图会更乱一般不需要。3.3 根轨迹图增益变化与极点走向根轨迹画的是闭环极点随开环增益 $K$ 从 0 到 $\infty$ 变化的轨迹。rlocus(sys)直接画rlocfind可以交互式选点读增益。figure; rlocus(sys_rlc); grid on; title(Root Locus of RLC System); % 交互式选取增益 % [K, poles] rlocfind(sys_rlc); % 取消注释后鼠标点选rlocus画出的每条分支从一个开环极点出发终止于一个开环零点或无穷远。分支数等于极点数。读图时关注三点轨迹是否穿过虚轴决定稳定增益范围、分离点在哪里决定阻尼变化、渐近线角度决定高频走向。rlocfind会返回你点选位置对应的增益和闭环极点适合做“给定阻尼比反推增益”的活。如果系统有多个参数变化比如同时调 $K_p$ 和 $K_i$根轨迹就不够用了得用sisotool或者自己写循环扫参数。根轨迹的局限性在于它只适合单参数变化多参数场景下容易误导。3.4 零极点图一眼看清左右半平面pzmap(sys)把零点和极点画在复平面上零点用圆圈极点用叉号。这张图信息密度最高但最容易被忽略。figure; pzmap(sys_rlc); grid on; title(Pole-Zero Map of RLC System); % 获取零极点数值 z zero(sys_rlc); p pole(sys_rlc); disp(零点); disp(z); disp(极点); disp(p);读零极点图时右半平面的极点直接判不稳定右半平面的零点会导致非最小相位特性比如初始反向响应。虚轴上的极点说明系统有振荡模态共轭极点对对应一个二阶振荡环节。零极点距离虚轴越近对动态响应影响越大。如果零点和极点靠得很近可能互相抵消实际系统阶数比传递函数看起来低这时候要考虑模型降阶。4. 避坑与排查传递函数图里最容易翻车的五个地方4.1 现象伯德图幅频曲线在低频段翘起来原因传递函数里有积分环节$1/s$低频增益趋于无穷MATLAB 默认频率范围没覆盖到足够低的频段或者den最后一项写成了非零值把积分环节变成了惯性环节。解决检查den最后一项是否为零。如果是积分环节den [1 0]对应 $1/s$den [1 1]对应 $1/(s1)$。画图时用bode(sys, {1e-3, 1e3})把低频范围拉宽确认斜率是不是 -20 dB/dec。4.2 现象奈奎斯特图包围圈数数不对原因MATLAB 默认只画正频率负频率部分需要手动补全或者传递函数有虚轴上的极点nyquist会画一个无穷大半径的圆弧容易看漏。解决用nyquist(sys, {wmin, wmax})指定频率范围避开虚轴极点。如果极点就在虚轴上先做小扰动移到左半平面再画。判断包围圈数时从 $(-1, j0)$ 点向曲线引射线数穿越次数顺时针减逆时针。4.3 现象根轨迹分支数对不上极点数原因传递函数分子分母有公因子minreal没做MATLAB 把零极点对消的环节也算进去了。解决画图前先sys_min minreal(sys)把可对消的零极点去掉。minreal的容差默认是sqrt(eps)如果零极点靠得很近但不完全相等可以手动指定容差minreal(sys, 1e-6)。4.4 现象离散系统伯德图频率轴单位混乱原因tf对象的Ts没设对或者画图时用了bode但频率范围给的是 Hz 而不是 rad/s。解决确认sys.Ts的值Ts -1是连续系统Ts 0是离散系统。画图时统一用 rad/s或者用bode(sys, {2*pi*fmin, 2*pi*fmax})把 Hz 转成 rad/s。离散系统在奈奎斯特频率附近幅频曲线会翘这是双线性变换的正常现象不要试图“修平”。4.5 现象margin返回的裕度是负数但系统仿真稳定原因margin算的是开环频域裕度如果系统是非最小相位或者有延迟频域裕度和时域稳定性可能不一致。另外margin对多输入多输出系统只取第一个通道容易误判。解决先用step(feedback(sys, 1))看阶跃响应确认时域稳定。如果是非最小相位系统频域裕度只能做参考最终以时域仿真为准。MIMO 系统用margin要指定通道或者改用sigma画奇异值图。5. 进阶技巧把传递函数图用成设计工具5.1 用sisotool做交互式控制器设计sisotool(sys)打开控制系统设计器左边是根轨迹或伯德图右边是阶跃响应可以拖拽零极点实时看效果。这个工具适合做 PID 整定和超前滞后校正。我一般先用sisotool粗调拿到零极点位置后再用pidtune或者手动写tf复现。% 打开交互式设计器 % sisotool(sys_rlc); % 取消注释后运行 % 用 pidtune 自动整定 PID [C, info] pidtune(sys_rlc, PID); disp(C); disp(info); % 闭环阶跃响应 sys_cl feedback(C * sys_rlc, 1); figure; step(sys_cl); grid on;pidtune返回的info里有相位裕度和截止频率可以和你手动设计的结果对比。pidtune默认目标是 60° 相位裕度如果系统本身阻尼很小整定出来的增益可能偏保守需要手动加大。5.2 批量扫参数画一族伯德图做鲁棒性分析时经常要看好几个参数下的频响。用循环生成传递函数数组再一次性画出来。R_values [5, 10, 20, 50]; % 不同电阻值 figure; hold on; for i 1:length(R_values) R_i R_values(i); den_i [L*C, R_i*C, 1]; sys_i tf(1, den_i); bode(sys_i, {10, 1e5}); end legend(R5, R10, R20, R50); grid on; hold off;hold on之后连续bode会把曲线叠在同一张图上。注意每次bode都会刷新频率范围如果范围不一致后面的图会覆盖前面的。解决办法是第一次调用时指定范围后续用bode(sys_i)不带范围或者统一用bode(sys_i, w)传入固定的频率向量w logspace(1, 5, 500)。5.3 从图反推传递函数tfest与频响数据如果手里只有实测频响数据可以用tfest辨识传递函数。先把数据整理成iddata对象再指定极点数。% 假设 freq 是频率向量mag 和 phase 是幅值和相位 % resp mag .* exp(1j * deg2rad(phase)); % data idfrd(resp, freq, Ts); % sys_est tfest(data, 2); % 辨识 2 阶传递函数 % bode(sys_est, data); % 对比辨识结果和实测数据tfest的阶数选择很关键阶数太低拟合不准太高会过拟合。我一般从 2 阶开始试看拟合百分比sys_est.Report.Fit.FitPercent到 85% 以上就够用。辨识出来的传递函数要检查零极点是否在左半平面右半平面的零极点可能是噪声引起的需要手动剔除。5.4 一个我常犯的错误早年做电机控制时我把电流环的传递函数写成 $1/(LsR)$画伯德图看截止频率挺合适结果一上电就振荡。后来才发现漏了 PWM 延迟和采样保持环节实际传递函数多了一个 $e^{-T_d s}$相位在截止频率附近掉了 30 多度裕度根本不够。从那以后我养成了一个习惯画完理论伯德图一定再叠一条含延迟的近似曲线用pade把延迟展开成有理函数对比两条曲线的相位差。如果差超过 20°设计就得留更多裕度。这个习惯帮我省了不少后悔药。希望帮到你。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表