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

发布时间:2026/10/13 21:19:58

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 项时比如(s5)/(s^23s2)分子必须写[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通分成(2s1)/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/(1L*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/s500 个点 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或absPhaseUnits可选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 默认不画。要画得用ngridfigure; 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 图上表现为曲线从第三象限出发不先看极点零点画完图容易误判稳定性。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/13 21:19:58

Python实战:PDF关键词提取与TF-IDF分析全流程

1. 从一份PDF到一张关键词地图:这个项目到底在解决什么问题手里有一堆PDF,想快速知道每份文件到底在讲什么、哪些词是这份文件区别于其他文件的“指纹词”——这个需求在文档管理、竞品分析、学术文献综述、合同归档等场景里反复出现。我最早接触这类需求…

2026/10/13 21:14:56

MATLAB卷积编解码实战:从零搭建到避坑指南

简介:这份资源是一套自编的卷积码编解码MATLAB实现,面向通信原理、信息论与编码课程的学习者,以及需要完成相关作业或仿真实验的学生。内容围绕卷积码的编码与Viterbi译码展开,涵盖移存器与生成多项式建模、网格图路径搜索、不完全…

2026/10/13 22:25:19

RPA CoE与GPT结合:企业自动化架构设计与落地实操

1. 当RPA CoE遇上GPT:一场企业自动化的化学反应第一次听到"RPA CoE x GPT"这个组合的时候,我正蹲在一个流程自动化的项目里焦头烂额。业务方丢过来三十多个流程需求,每个都喊着"急",而团队里能写RPA脚本的就那…

2026/10/13 22:25:19

生成式BI落地实践:语义层建设与准确率优化指南

1. 生成式BI到底在解决什么问题1.1 从“看报表”到“问报表”的交互范式转移传统BI的使用路径,做过数据分析的人都很熟悉:业务方提需求,数据团队理解需求,然后写SQL、建模型、拖仪表板,最后交付一个看板。业务方看完之…

2026/10/13 22:25:19

GD32W515板载Wi-Fi驱动开发:寄存器级初始化与零拷贝DMA实战

简介:本资源是面向嵌入式开发工程师与GD32系列初学者的GD32W515官方开发板完整BSP驱动工程,聚焦低功耗Wi-Fi MCU平台的外设驱动实践与NES游戏模拟器移植实战。项目已实现板载全部外设基础驱动,并成功将经典NES模拟器移植至GD32W515平台——CP…

2026/10/13 22:25:19

OpenBot:用安卓手机做机器人主控的软硬协同方案

简介:本资源是Intel实验室开源的低成本自主导航机器人OpenBot完整实现方案,面向嵌入式开发、移动机器人与边缘AI初学者及实践者,解决视觉导航系统从算法部署到硬件集成的一站式学习需求。压缩包共233个文件,涵盖Arduino控制程序&a…

2026/10/13 22:20:16

真实可用推广系统源码:从渠道管理到归因分佣的闭环实现

简介:这是一套真实可用的PHP推广系统源码,面向具备PHP开发基础的中高级开发者及互联网营销技术团队,用于快速搭建、定制和优化在线广告推广平台。资源解决广告投放管理、用户行为追踪、转化效果分析与佣金结算等核心营销自动化需求&#xff0…

2026/10/13 5:19:27

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/13 17:09:18

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/13 0:04:41

基于Triton部署YOLO目标检测:从训练脚本到线上服务

简介:这份资源面向希望将目标检测模型落地到生产环境的深度学习开发者与算法工程师,聚焦于用 Triton Inference Server 部署 YOLOv9 的完整实战方案,解决从训练权重到线上推理服务之间的工程化难题。压缩包共 16 个文件,约 886KB&…

2026/10/13 0:04:41

手把手教你云端部署Qwen-Image-2.1:从GPU选型到在线文生图服务

Qwen-Image-2.1 这个开源的图像生成模型,最近在内容创作和 AI 应用圈子里热度相当高。它属于通义 Qwen 系列里的视觉生成分支,让我眼前一亮的是它对中文长文本的理解能力——以前用那些老方案生成带中文文字的图,十个里九个是“乱码印刷体”&…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑