简介这份资源面向学习自动控制原理、需要掌握频域分析方法的本科生与工程技术人员针对传统用MATLAB M语言绘制Bode图耗时费力、不便于直观理解频域指标的问题改用Simulink可视化工具演示开环与闭环Bode图的绘制流程。资源包共1个PDF文件约872KB内容围绕PID控制环路实例展开涵盖开环输入输出设置、闭环扰动与输出测量设置、线性分析调用及Bode图生成等关键环节并说明如何对比不同控制器参数下的图形变化以及用一阶、二阶系统验证理论计算与仿真结果的一致性。目前已有1326人学习下载适合希望摆脱繁琐编程、快速上手频域分析的读者参考也可作为课堂教学之外的实践补充材料。1. 从 M 语言到 Simulink为什么我劝你先别急着敲bode()命令刚入行那会儿我也觉得用 M 语言画 Bode 图是“正统”——毕竟教材上都是这么教的。直到有一次在产线调伺服环路现场只有一台装了 MATLAB 的工控机我蹲在设备旁边敲了半小时脚本结果传递函数里一个符号写错相位曲线整个翻上去差点把谐振点判反。那次之后我才认真把 Simulink 的线性分析工具捡起来用。这个资源讲的就是这件事利用 Simulink 绘制控制系统的 Bode 图覆盖开环和闭环两种场景。它不跟你绕频域理论的弯子而是直接告诉你——在模型里哪根线上右键、选哪个菜单、点哪个按钮Bode 图就出来了。适合两类人一类是正在学《自动控制原理》、被 M 语言脚本折腾得够呛的学生另一类是手头有 Simulink 模型、需要快速看频域指标但不想写代码的工程师。核心价值就一句话把“建模—线性化—画图”这条链路从代码里解放出来变成鼠标点几下的事。当然前提是你的模型得先搭对。2. 开环 Bode 图从信号线标记到 Linear Analysis 的完整链路2.1 为什么开环和闭环要用不同的标记方式Simulink 的线性分析工具本质上是在做一件事在指定的工作点附近对模型进行线性化然后从你标记的输入到输出之间求传递函数。开环和闭环的区别不在于模型本身变了而在于你“从哪切进去、从哪量出来”。开环场景下你想看的是控制器被控对象串起来之后的频率特性也就是回路断开时的增益和相位。所以标记方式是在给定信号线上设Open-Loop Input在输出信号线上设Open-Loop Output。这两个标记告诉 Simulink“把从给定到输出这条前向通道单独拎出来别管反馈。”闭环场景下你想看的是整个闭环系统对扰动的响应。这时候标记换成Input Perturbation和Output Measurement——前者在给定信号线上注入一个小扰动后者在输出端测量响应Simulink 会自动把反馈回路算进去。这个区别如果搞混了画出来的图看着都像 Bode 图但截止频率和相位裕度可能完全对不上。我见过有人拿闭环标记去量开环特性结果相位裕度算出来是负的还以为系统要振荡了。2.2 开环 Bode 图的操作步骤与参数含义先假设你已经在 Simulink 里搭好了一个基本的 PID 控制环路给定信号进 PID 控制器控制器输出进被控对象对象输出反馈回来和给定做差。模型里至少要有这几根线给定信号线、控制器输出线、对象输出线。第一步标记开环输入。在给定信号线上单击右键菜单里找到Open-Loop Input点它。你会看到这根线上多了一个小标记表示 Simulink 已经把这根线识别为线性化的输入端口。第二步标记开环输出。在输出信号线上右键选Open-Loop Output。同样会出现标记。第三步打开线性分析工具。菜单栏走Analysis → Control Design → Linear Analysis。这时候会弹出一个叫 Linear Analysis Tool 的窗口左边是模型里的信号列表右边是待绘制的图列表。第四步选 Bode 图。在 Linear Analysis Tool 里找到 Bode 选项点一下。Simulink 会自动在你标记的输入输出之间做线性化然后画出 Bode 图。第五步读图。出来的图横轴是频率rad/s 或 Hz取决于你的设置纵轴上半部分是幅值dB下半部分是相位度。幅值曲线穿越 0 dB 的频率就是截止频率相位曲线在截止频率处离 -180° 的距离就是相位裕度。这里有个参数容易被忽略线性化的工作点。Simulink 默认在当前模型状态下做线性化如果你的模型里有非线性环节比如饱和、死区工作点不同线性化结果会差很多。常见做法是先把模型仿真到稳态再打开 Linear Analysis Tool这样线性化点更接近实际工作状态。% 如果你想把线性化结果导出到 MATLAB 工作区做后续处理 % 在 Linear Analysis Tool 里点击 Export选择导出为 tf 或 ss 对象 % 导出后可以在命令行里直接调用 bode() 做自定义绘图 sys_open tfest(iddata(y, u, Ts), 2); % 这只是示例实际用导出的对象 bode(sys_open); grid on;上面这段代码不是必须的但如果你后续要做控制器综合或者频域指标自动计算把线性化结果导出成tf或ss对象会方便很多。tfest那行只是示意实际应该用 Linear Analysis Tool 导出的对象不要自己重新拟合。2.3 验证用一阶传递函数对拍学完方法之后怎么确认自己没搞错最稳妥的办法是拿一个已知传递函数的简单系统来对拍。在 Simulink 里建一个最简单的开环模型一个Transfer Fcn模块传递函数设成1/(s1)输入接一个Inport输出接一个Outport。然后按上面的步骤标记 Open-Loop Input 和 Open-Loop Output画 Bode 图。理论上的结果你应该能背出来截止频率 1 rad/s幅值以 -20 dB/dec 下降相位从 0° 渐近到 -90°。如果 Simulink 画出来的图和这个对不上那一定是标记或者线性化设置出了问题。再进一步可以试二阶系统1/(s^20.2s1)看谐振峰是否出现在自然频率附近。这种对拍习惯一旦养成后面遇到复杂模型时心里就有底了——你知道工具本身是准的出问题只可能是模型或标记的问题。3. 闭环 Bode 图Input Perturbation 与 Output Measurement 的配合3.1 闭环标记的物理含义闭环 Bode 图看的是系统在闭环状态下对给定或扰动的频率响应。标记方式换成Input Perturbation和Output Measurement之后Simulink 的线性化逻辑变了它不再“切断”反馈回路而是在工作点附近对整个闭环系统做线性化。具体来说Input Perturbation 标记的那根线上Simulink 会注入一个小信号扰动Output Measurement 标记的那根线上它会测量响应。两者之间的传递函数就是闭环传递函数。这里有个细节Input Perturbation 通常标在给定信号线上Output Measurement 标在输出信号线上。但如果你想看扰动到输出的闭环传递函数也可以把 Input Perturbation 标在扰动注入点上。标记位置不同得到的传递函数物理意义不同读图时要注意区分。3.2 操作步骤与开环的差异点操作流程和开环基本一致差异只在标记那两步第一步在给定信号线上右键选 Input Perturbation。注意不要和 Open-Loop Input 搞混菜单里这两个选项挨得很近。第二步在输出信号线上右键选 Output Measurement。第三步到第五步和开环一样Analysis → Control Design → Linear Analysis → Bode → 读图。但读图的时候要留意闭环 Bode 图的低频增益通常接近 0 dB因为闭环系统对给定信号的稳态跟踪能力高频段幅值下降。如果低频增益明显偏离 0 dB可能是控制器里没有积分环节或者工作点选得不对。3.3 参数对比改完 PID 参数后怎么快速刷新这是这个资源里最实用的一招改完控制器参数后不用重新走一遍线性分析流程直接在原来的 Bode 图窗口里点一下 “Bode Plot1” 标签图就会自动刷新。背后的逻辑是Linear Analysis Tool 里的 Bode 图是“活”的它和模型之间保持着链接。你改了模型里的 PID 参数Simulink 会检测到模型变化重新做线性化然后更新图。不需要重新标记、不需要重新打开工具。但这里有个坑如果你的模型改动涉及结构变化比如增加或删除了模块、改变了信号连接关系原来的标记可能会失效。这时候 Bode 图要么不更新要么报错。解决办法是重新标记输入输出或者干脆关掉 Linear Analysis Tool 重新打开。另外如果你同时想看多组参数下的 Bode 图做对比可以在 Linear Analysis Tool 里创建多个 Bode 图Bode Plot1、Bode Plot2……分别对应不同的标记组合或不同的线性化设置。这样就能在一张图上叠加多条曲线直观比较不同 PID 参数对截止频率和相位裕度的影响。4. 避坑与排查Bode 图不对时先查这五件事4.1 现象Bode 图是空的或者只有一条直线原因最常见的情况是标记没设对。比如只设了 Open-Loop Input 但忘了设 Open-Loop Output或者标记设在了错误的信号线上。另一种可能是模型里存在代数环导致线性化失败。解决先检查信号线上的标记图标是否出现。如果没有重新右键设置。如果标记都在但图还是空的试着在 Linear Analysis Tool 里手动指定线性化输入输出而不是依赖模型里的标记。代数环的问题需要先在模型里加 Unit Delay 或 Memory 模块打断。4.2 现象开环 Bode 图的相位裕度是负的但系统仿真明明稳定原因大概率是把闭环标记当开环用了或者线性化工作点选在了非线性环节的不敏感区域。还有一种可能是模型里存在多个反馈回路Simulink 线性化时选错了回路断开点。解决确认标记是 Open-Loop Input/Output 而不是 Input Perturbation/Output Measurement。如果是多回路系统在 Linear Analysis Tool 里手动选择开环点而不是依赖信号线标记。4.3 现象改了 PID 参数后 Bode 图没变化原因Linear Analysis Tool 没有检测到模型变化或者 Bode 图处于“冻结”状态。有时候是因为模型改动后没有保存Simulink 不认为模型变了。解决在 Linear Analysis Tool 里手动点击 Refresh 按钮。如果还不行关掉工具重新打开。养成改完参数后按 CtrlS 保存模型的习惯能避免很多玄学问题。4.4 现象Bode 图频率范围和预期对不上原因Linear Analysis Tool 默认的频率范围是根据系统动态特性自动选的有时候会漏掉关键频段。比如系统在 1000 rad/s 附近有谐振但默认范围只到 100 rad/s。解决在 Bode 图的属性里手动设置频率范围。右键图 → Properties → Limits把频率上下限改成你关心的范围。或者在线性化选项里指定频率向量。4.5 现象导出的传递函数和手动推导的对不上原因线性化工作点不对。Simulink 默认在当前仿真时刻做线性化如果你的模型还没跑到稳态线性化结果反映的是瞬态特性不是稳态频率响应。解决先把模型仿真足够长的时间确保所有状态都进入稳态再打开 Linear Analysis Tool。或者在 Linear Analysis Tool 里手动指定工作点用findop命令先算稳态工作点再基于该工作点做线性化。5. 进阶技巧把 Bode 图变成可复用的频域分析模板前面讲的都是单次操作。但实际工作中你不可能每次改参数都重新走一遍菜单。我一般会做两件事把线性化结果导出成对象然后用脚本批量画图。在 Linear Analysis Tool 里选中你画好的 Bode 图点击 Export 按钮选择导出为tf或ss对象。导出后MATLAB 工作区里会多一个变量比如sys_open。然后你就可以用命令行做各种自定义操作% 假设 sys_open 是从 Linear Analysis Tool 导出的开环传递函数 % 计算幅值裕度和相位裕度 [Gm, Pm, Wcg, Wcp] margin(sys_open); % 打印结果 fprintf(幅值裕度: %.2f dB (在 %.2f rad/s)\n, 20*log10(Gm), Wcg); fprintf(相位裕度: %.2f deg (在 %.2f rad/s)\n, Pm, Wcp); % 自定义 Bode 图标注裕度点 figure; bode(sys_open); grid on; hold on; % 在截止频率处画竖线 xline(Wcp, --r, Phase Margin); % 在穿越频率处画竖线 xline(Wcg, --g, Gain Margin);这段代码的逻辑是margin函数自动计算幅值裕度、相位裕度和对应的频率点然后你用bode画图再用xline把关键频率标出来。这样每次改完参数只需要重新导出一次sys_open跑一遍脚本就能得到带标注的 Bode 图比在 GUI 里手动读点快得多。参数说明Gm是幅值裕度线性值不是 dBPm是相位裕度度Wcg是相位穿越频率-180° 处的频率Wcp是幅值穿越频率0 dB 处的频率。20*log10(Gm)是把线性幅值转成 dB。还有一个技巧用bodeplot配合getoptions做批量对比。如果你有多组 PID 参数对应的传递函数可以一次性画在一张图上% 假设 sys1, sys2, sys3 是三组不同 PID 参数下的开环传递函数 figure; bode(sys1, b, sys2, r--, sys3, g-.); grid on; legend(PID-1, PID-2, PID-3); title(不同 PID 参数下的开环 Bode 图对比);这种批量对比在调参阶段特别有用。你不需要反复在 GUI 里点来点去只需要把每次导出的传递函数存下来最后统一画图。从那以后我每次做频域分析都强制走一遍“Simulink 标记 → 线性化 → 导出 → 脚本画图”的流程。GUI 用来快速看趋势脚本用来做精确计算和报告输出。两者配合既不会漏掉细节也不会在重复操作上浪费时间。希望帮到你。本文还有配套的精品资源点击获取