简介面向控制系统学习者和MATLAB初学者的一套传递函数可视化示例围绕S平面上传递函数的三维曲面绘制展开适合用来理解复频率域中幅频、相频特性与极点零点分布的关系。压缩包共2个文件包含1个m脚本与1个txt说明整体约2KB体积轻量脚本对应绘图主流程文本文件用于补充使用许可等信息。已有1822人学习说明该示例在Simulink基础与控制系统仿真入门场景中具有一定参考价值。读者可借此了解如何用tf构建传递函数模型、设定频率范围并计算频率响应再通过三维曲面呈现系统在不同频率下的行为也可将其作为课程实验、自学练习或系统分析的可视化模板便于后续替换参数、观察曲线变化并加深对稳定性与动态性能的理解。1. 先弄明白一件事传递函数图到底画的是什么很多人第一次听到“传递函数图”这四个字脑子里浮现的是一堆带 s 的分式和几条看不懂的曲线。换个说法就好懂了把系统想成一台豆浆机豆子和水是输入豆浆是输出机器内部刀片怎么转、加热管怎么烧你并不关心你只关心“放多少豆、出多浓的浆”——这个从输入到输出的换算关系用数学写下来就是传递函数把它画成曲线就是传递函数图。在 MATLAB 里几张传递函数图靠几行命令就能出来在 Simulink 里拖三个方块连起来也能出。这篇入门就是写给完全没碰过控制仿真的零基础新手的不要求你先啃完复变函数也不要求你会写脚本只要能把软件打开跟着一步步做就能拿到自己人生第一张传递函数图。2. 为什么学控制仿真要先碰传递函数它是整个 Simulink 基础的地基2.1 一台机器写成微分方程之后人就基本看不懂了假设你要描述一个简单的电机给电压转速慢慢升上来中间有惯量、有阻尼。老老实实按物理定律写得到的是一个微分方程里面带着导数项。一个电机还能勉强看等你把电机、减速器、传感器、控制器串成一条链方程会滚成一团谁看谁头大。传递函数干的事情是把这团方程“翻译”成代数式。翻译工具叫拉普拉斯变换你不需要会推导只需要记住它最有用的一条性质对时间求导在变换之后变成乘以一个变量 s对时间积分变成除以 s。于是原来满屏的 d/dt全部变成了普通的乘除微分方程就退化成了多项式相除。这一步带来的好处是实实在在的。原来判断一个系统稳不稳定、响应快不快要解微分方程现在只要看分母多项式那几个系数也就是所谓的极点就能大致判断。工程师嘴上说的“这个系统阻尼太小”“这个系统有积分环节”指的都是分母上那几个数字。传递函数图就是把这几个数字背后的行为画给你看。我第一次学的时候卡了很久的一个点是为什么输入输出都用大写字母中间还要除一下。后来想通了——它本质就是一个“放大倍数”只不过这个倍数不是固定的数而是随频率变化的。低频时它放大多少、高频时它衰减多少、在哪个频率上开始往下掉这些信息全在里面。图就是把这份“随频率变化的放大倍数”摊开给你看。2.2 零基础真正要补的前置知识只有三小块看到“拉普拉斯变换”五个字就想关页面是很多新手的真实反应。但你真要做的是画图不是考试需要补的东西比想象中少得多。第一块是多项式。软件里写分母系数用的是方括号加一串数字比如[0.5 1]意思是 0.5s 1[1 2 1]意思是 s² 2s 1。规则只有一条按 s 的降幂排列从最高次写到常数项中间缺哪一项就补 0。这个规则看着简单却是新手最容易写错的地方后面避坑那章还会专门说。第二块是复数只需要一点点。极点是分母等于 0 时 s 的解可能带虚部。极点落在左半平面系统就稳定落在右半平面输出会一路发散。你不用会算只要看得懂“图上的叉叉跑到右边去了说明要出事”这个信号就够了。第三块是拉普拉斯变换的三个结论求导乘 s、积分除 s、常数的变换是个 1/s也就是阶跃。记住这三条你就能把大部分教科书上的微分方程翻译成传递函数剩下的交给软件。我建议的路径是不要先去补数学先跑通一个例子让自己看到“改一个数字图上那条线就变了”有了这个直观感受再回头补理论会快很多。纯粹按教科书顺序从第一章啃到第五章多半会在第三章放弃。2.3 打开软件先认三个地方别急着写代码软件装好之后第一次打开界面上东西很多先只认三个地方其他的都可以先无视。命令行窗口Command Window是那个可以打字的地方敲一句回车立刻出结果适合试错。编辑器是写脚本的地方新建一个脚本文件把多行命令存起来以后一键运行。当前文件夹Current Folder决定了你的脚本存哪儿、软件去哪里找文件很多“明明代码没错却报找不到函数”的问题根源都在这里。先跑两行命令确认环境是好的% 逐行敲进命令行窗口每行回车看结果 ver % 列出已安装的工具箱重点找 Control System Toolbox 和 Simulink pwd % 打印当前文件夹路径脚本默认就存在这个位置ver的输出是一张清单你要确认清单里同时出现了控制系统工具箱和 Simulink前者负责tf、step这些命令后者负责图形化建模。少任何一个后面都会卡住。pwd打印出来的路径如果带中文建议换一个纯英文目录这是血泪经验中文路径引发的报错信息往往指向莫名其妙的地方很难查。提示把工作目录固定成一个你记得住的英文文件夹比如 D 盘下新建一个 control_demo以后所有练习脚本都放这里能省掉大量“文件去哪了”的麻烦。3. 第一个例子用五行命令画出你的第一张传递函数图3.1 用 tf 把一个式子变成软件认识的“系统”先从一个最简单的一阶系统上手它的传递函数是 1/(0.5s1)。这个式子在工程里极其常见代表一个“反应有点慢、但最终会稳定下来”的环节比如温度上升、电机提速的粗略模型。把它交给软件只需要两行准备加一行生成% 一阶惯性环节 G(s) 1 / (0.5s 1) num 1; % 分子系数只有常数项 1 den [0.5 1]; % 分母系数按 s 的降幂排列0.5s 1 G tf(num, den) % 生成传递函数对象回车后会在窗口里回显tf是 transfer function 的缩写两个输入分别是分子和分母的系数向量。运行之后命令行会回显一个分式上面是 1下面是 0.5s1看到这个回显就说明对象建好了。这里的参数含义要拎清楚num决定“输出被放大多少”den决定“系统自己怎么衰减、怎么振荡”。分母最高次是 1叫一阶系统最高次是 2叫二阶系统行为会复杂不少。方括号里的数字顺序绝对不能反写成[1 0.5]就是 1·s 0.5完全是另一个系统了。新手第一次翻车八成翻在这个顺序上。回显里如果分母出现了 s 的高次项而你本来只想写一阶那就说明系数写多了或者写漏了。养成习惯每次建完对象先看一眼回显的式子是不是你脑子里那个式子再往下走。3.2 step 阶跃响应图上的每条线都在说话系统建好了接下来画图。最常用的一张图叫阶跃响应图意思很直白给系统一个“突然从 0 跳到 1”的输入看它怎么反应。就像你把水龙头一下拧到固定开度看水位怎么涨上来。figure; % 新开一个图窗避免把上一张图覆盖掉 step(G); % 画阶跃响应曲线 grid on; % 打开网格方便读数值 title(一阶系统阶跃响应); % 给图加个标题 xlabel(时间 (s)); % 横轴是时间 ylabel(输出); % 纵轴是响应值运行后会弹出一个窗口里面是一条从原点出发、先陡后缓、最后贴着 1 这条水平线不动了的曲线。这条曲线有三个读法看懂这三个就够用了。第一最终停在哪儿。这条线最后爬到 1说明稳态输出是 1也就是“输入 1最终输出也是 1”这个系统的稳态增益是 1。如果它最后停在 0.5说明增益是 0.5输入 1 只能得到一半的输出。看稳态值就是在看增益。第二爬得多快。图上大约在 0.5 秒的位置曲线爬到了 0.632 左右。这个 0.632 不是巧合一阶系统在 t 等于时间常数时正好走完总路程的 63.2%。这里的 0.5 就是分母里的那个 0.5也就是时间常数。时间常数越小线越陡系统反应越快。第三有没有超调。这条线一路向上、老老实实贴到 1没有冲过头再退回来。冲过头那种“上去一下再荡回来”的形态叫超调是二阶及以上系统才有的特征也是后面调参数时最需要盯的东西。注意step(G)不带输出参数时直接画图写成y step(G)则把数据取回来不画图。新手常常两者混着用结果“运行了但没图”白找半天。3.3 bode 和 pzmap同一个系统的另外两副面孔同一个传递函数软件能画出好几种图它们不是不同的东西而是同一个系统的不同侧面。除了阶跃响应最该认识的是伯德图和零极点图。figure; bode(G); % 伯德图上面画幅值随频率变化下面画相位随频率变化 grid on; figure; pzmap(G); % 零极点图把分子为 0 的零点(圆圈)和分母为 0 的极点(叉号)画在复平面上 grid on;伯德图横轴是频率取了对数坐标所以看着像一根根竖线。上面那张图画的是“这个频率的信号经过系统后被放大还是被削弱”下面那张图画的是“相位被推迟了多少”。一阶系统的伯德图特征很好认低频段是一条水平线说明低频信号原样通过到某个频率之后开始以固定斜率往下掉说明高频信号被压住了。这个“开始往下掉的频率”就是转折频率等于 1/时间常数。零极点图更抽象一点但判断稳定性最快。图上凡是叉号全都在左半边系统就稳定只要有一个叉号跑到右半边这个系统做出来就会发散输出越摆越大。圆圈是零点影响的是响应的形状不直接决定稳定与否。三种图的分工可以按下面这张表来记图命令主要看什么什么时候用阶跃响应图step稳态值、上升快慢、超调量想知道系统“被推一下会怎么动”伯德图bode转折频率、高频衰减、相位裕度想知道系统“对不同快慢的信号怎么处理”零极点图pzmap极点是否全在左半平面想快速判断“这东西稳不稳”实际工作中三张图经常一起看先用零极点图确认稳定性再用阶跃响应看时域表现最后用伯德图看频域余量。新手阶段不必强求理解每一步推导能对着图说出“它在往哪走、快不快、稳不稳”就已经跨过门槛了。3.4 把命令存成脚本下次一键重跑命令行窗口适合试错但真正要做点东西一定要落到脚本上。原因很实在你调到第十次参数的时候绝对想不起来第三次用的是哪组数。在编辑器里新建脚本把前面的命令按顺序整理好% demo_tf.m 第一个传递函数图脚本 clear; clc; close all; % 清变量、清屏、关掉旧图窗保证每次运行环境一致 wn 10; % 自然频率决定振荡的快慢 zeta 0.3; % 阻尼比越小振荡越厉害 G2 tf(wn^2, [1, 2*zeta*wn, wn^2]); % 标准二阶系统 figure; step(G2); grid on; title(sprintf(二阶系统阶跃响应 zeta%.2f, zeta)); stepinfo(G2) % 一次性打印上升时间、超调量、调节时间等指标这段脚本换成二阶系统是为了让你看到“改一个数字图就变样”的效果。zeta从 0.3 改成 0.9超调会明显收窄曲线变得温吞改到 0.1曲线会剧烈上下摆动好几下才停。wn决定摆动的快慢数值越大摆动越密。stepinfo是个很省事的命令它直接把上升时间、峰值、超调百分比、调节时间算成一张表打印出来不用你拿尺子在图上一格一格量。新手常犯的毛病是只看曲线“感觉差不多”其实两个系统的超调一个是 5% 一个是 45%光靠肉眼扫一眼很容易漏掉有个数值表对照就踏实多了。文件名和路径这段也值得说一句。脚本存成demo_tf.m文件名必须是英文、不用空格因为函数名和文件名是绑定的。存好之后点运行如果提示找不到某个函数先确认当前文件夹是不是这个脚本所在的文件夹这个排查顺序比怀疑代码写错更靠谱。4. 从代码走到 Simulink把同一个传递函数拖成一张连线图4.1 Simulink 和刚才那几行代码其实是同一件事前面写脚本是在跟数字打交道分子几个数、分母几个数。Simulink 换了个界面让你跟方块打交道输入是一个方块传递函数是一个方块看结果的示波器是一个方块中间用线连起来表示信号流向。两者算的是同一个东西区别在场景。系统只有三五个环节写代码更快改参数就是改一行数字。系统有三十个环节、还带反馈回路、有非线性环节比如限幅和死区方块图就好得多因为你一眼能看出信号从哪来到哪去不用在几十行代码里找“这个量到底传给谁了”。所以别把两者对立起来。常见的干活方式是先在脚本里把单个环节的传递函数调明白搞清楚它什么脾气再把它搬进 Simulink 组成大系统。顺序反了会很难受——方块图里双击模块看到一个[1 2 1]你不知道自己是写错了还是系统本来就该这样因为你没单独验证过它。打开方式很简单在命令行敲simulink % 打开 Simulink 起始页从模板或空白模型开始起始页里选 Blank Model就会弹出一个空白的模型窗口左边那个带方块图标的按钮是模块库Library Browser所有方块都从那里拿。4.2 手把手搭第一个模型阶跃、传递函数、示波器接下来搭一个和 3.1 节完全等价的模型用到的方块只有三个。第一步从模块库里拖一个 Step 方块进来它代表“突然跳变”的输入就是我们画阶跃响应时用的那个信号源。位置放在模型左边习惯上输入都在左、输出都在右。第二步拖一个 Transfer Fcn 方块放在中间。这个方块就是图形化的传递函数双击它能看到 Numerator coefficients 和 Denominator coefficients 两栏填法跟代码里一模一样也是降幂排列。第三步拖一个 Scope 方块放在右边它就是示波器负责把信号画出来。第四步连线。鼠标移到 Step 方块右侧的小箭头处按住拖到 Transfer Fcn 左侧的输入端口松开再从 Transfer Fcn 的输出拖到 Scope 的输入。连线成功时会变成一条实线带箭头如果只是虚影说明没接上。第五步双击 Transfer Fcn把 Numerator 填[1]Denominator 填[0.5 1]点确定。到这里模型和 1/(0.5s1) 已经完全对应上了。第六步设置仿真时长。模型窗口上方有个仿真时间输入框默认 10改成 5 秒就够看清这条曲线了。然后点 Run 按钮。第七步双击 Scope 打开波形窗口。因为现在的软件版本里示波器窗口不一定自动弹出跑完没看到图很常见双击一下就行不需要重新跑。整个过程中最容易出错的是连线那步。判断标准很简单线是实心带箭头的就对了线是虚的说明端口没接上。还有一种情况是线接上了但方向反了从输出接到输出软件会直接报错或者画出一条完全平直的线。4.3 参数怎么改双击模块里的分子分母系数模型搭好之后改参数就是双击。这一点比代码直观——代码里改参数要找到那一行模型里改参数是点开那个方块。Transfer Fcn 方块里的两栏含义和tf的两个参数完全一致。想把时间常数从 0.5 改成 2就把 Denominator 从[0.5 1]改成[2 1]重新跑一次Scope 里的曲线会明显变缓。这种“改一个数、立刻看图”的循环是 Simulink 最适合新手的地方比反复改脚本跑脚本快得多。Step 方块里有三个参数值得知道Step time 是跳变的时刻默认 1 秒意思是仿真开始后第 1 秒输入才从 0 跳到 1Initial value 和 Final value 是跳变前后的值默认 0 和 1。把 Step time 改成 0曲线就会从 0 时刻直接开始爬升和代码里step(G)的结果能对上。Scope 方块则要注意采样点数。默认设置下波形是连续的看着挺顺但如果仿真步长太大曲线会被画成折线看着像台阶。遇到波形毛毛糙糙的情况先在模型配置里把最大步长改小一点不要急着怀疑系统本身有问题。下表把代码里的写法和模块里的填法对照一下方便你两边切换代码写法模块填法含义num [1]Numerator coefficients:[1]分子系数降幂排列den [0.5 1]Denominator coefficients:[0.5 1]分母系数降幂排列step(G)Step 方块 Scope给阶跃输入并观察输出仿真时间0:0.01:10模型窗口的 Stop time决定算多长时间4.4 跑完仿真怎么把结果和代码画的图对上模型跑通只是第一步真正有价值的动作是“对账”把 Simulink 里 Scope 看到的波形和脚本里step(G)画出来的波形并排比一比看起点、稳态值、爬升速度是不是一致。能对上说明你对两边参数的理解是对的后面搭复杂系统才有底气。对不上通常就三种原因模块里的系数填错了Step 方块的跳变时刻不是 0导致波形整体右移了 1 秒仿真时间太短曲线还没爬到稳态就结束了。这三种都属于“参数问题”而不是“模型问题”逐项检查就能定位。对账这一步还有个额外收获你会慢慢建立起对数值的敏感度。同样是二阶系统阻尼比 0.3 的超调大概在 37% 左右阻尼比 0.7 的超调只有 4% 上下。这种量级感不是背出来的是画了几十次图之后自然长出来的以后看到一条曲线心里会先有个“这数不对劲”的直觉。模型记得存成.slx文件放在同一个英文目录下命名规则和脚本一样别用中文和空格。存好之后下次双击就能打开不用从头搭。5. 新手避坑传递函数图最容易翻车的五个地方5.1 五个高频翻车现场逐个拆开看第一个坑曲线一路冲上天根本不停。现象是step画出来的线越走越高或者上下摆动的幅度一次比一次大。原因基本是极点在右半平面换句话说分母系数里有个负数或者系数顺序写反导致分母变成了一个不稳定的多项式。解决办法是先跑一次pzmap(G)看叉号是不是跑到了右半边再回头逐个核对den里的数字和顺序特别注意常数项不能是负数或者 0。第二个坑报错说找不到tf。现象是命令行一片红字提示未定义函数或变量。原因是控制系统工具箱没装或者装了你却没在正确的环境里运行。解决办法是敲ver在输出清单里确认有没有 Control System Toolbox没有就得补装别试图用别的命令替代tf是这一整套流程的入口。第三个坑阶跃响应的稳态值不是 1。现象是曲线爬到一个不是 1 的值就停了比如停在 2 或者 0.5。原因是分子分母没有按常数项归一化传递函数的直流增益不等于 1。解决办法是先把分母的常数项除掉让分母常数项变成 1或者干脆自己算一下dcgain(G)看这个数是不是你想要的。很多新手以为是画图出了问题其实是系统增益本来就不是 1。第四个坑Simulink 里 Scope 一片空白。现象是点了 Run仿真跑完了打开示波器什么都没有。原因通常是三个连线是虚的没接上仿真时间设成了 0 或者特别短Scope 的输入端口接错了对象。解决办法是先看模型里的线是不是实心带箭头再把 Stop time 改回 5 到 10 秒之间重跑一次最后双击 Scope 确认输入端口只连了一根线。第五个坑figure没写图被覆盖。现象是连续跑两段画图代码只看到最后一张图前面那张消失了。原因是没有在每次画图前新开图窗后一张图直接盖在了前一张上面。解决办法是在每个画图命令前加一句figure反过来如果你希望每次运行都从干净状态开始就在脚本开头写close all。这两句一个负责开、一个负责关别搞混。5.2 报错窗口别急着关按三段式读一遍新手看到红字的第一反应是关掉重来其实报错信息里藏着的线索比你想的多。养成按三段读的习惯第一段看它说“什么类型的问题”是找不到函数、维度不匹配还是参数非法第二段看它指向哪一行、哪个文件名第三段看它给出的具体名字那个名字往往就是出问题的变量或函数。举个常见的例子提示某个变量未定义。九成情况是这个变量在你运行的那段代码里根本没赋值或者你只运行了脚本的后半段而跳过了前半段。解决办法不是改代码而是从头完整运行一次或者先把用到的变量单独在命令行里赋个值试试。再比如提示矩阵维度不一致这在传递函数里几乎总是分子分母的长度或阶次对不上。这时候不要盯着代码逻辑看先把num和den分别打印出来看看实际长度是不是你以为的那个长度问题往往一眼就露出来了。提示把报错信息的最后一行复制下来去搜比搜整段报错有效得多。最后一行通常包含最关键的那个函数名或变量名。6. 下一步学什么从一张图走到一套能交付的仿真流程把前面几节跑通之后你已经能画出传递函数图、能在 Simulink 里搭出等价的模型接下来该往哪儿走我的建议是按“先窄后宽”的顺序推进不要一上来就扑向复杂系统。第一步把三种图练熟。挑五个经典的传递函数——一阶惯性、二阶欠阻尼、带积分环节、带一个零点、纯延迟近似——每个都画一遍阶跃响应、伯德图和零极点图并且强迫自己用一句话说出这个系统的脾气。这一步大概花两三个晚上但收益极大以后看到任何一条曲线你心里都有参照物。第二步把反馈接起来。前面画的都是开环也就是信号一路往前不回头。真实的控制系统几乎都有反馈把输出取回来和期望值比较差多少补多少。在 Simulink 里加一个 Sum 方块做减法、把输出线绕回去就是一个最基本的闭环。这一步会第一次让你遇到“增益调大了系统会振荡”的现象而这个现象正是控制工程的核心议题。第三步开始记录。每调一组参数把参数、图、一句结论记在一个文档里哪怕只有三行。我吃过这个亏调了两天觉得找到最优点结果想复现的时候完全不记得当时那组数是多少只能从头再来一遍。后来我强制自己每次改参数都留一行记录效率反而提高了。按这个节奏学习路径大致可以这么排阶段重点大概投入检验标准第一阶段单个传递函数的三种图2 到 3 个晚上看到曲线能说出增益、快慢、稳不稳第二阶段二阶系统的阻尼与超调1 周能凭参数预估超调量级第三阶段闭环与反馈1 到 2 周能解释“增益调大为什么振荡”第四阶段把模型和脚本对账持续两边结果能对上参数改动可复现如果只能给一条建议那就是不要贪多。一次只改一个参数改完立刻看图看完图写一句结论。这个循环重复三十次比看十篇教程管用得多。那份整理好的传递函数图材料里面几种典型系统的代码和模块参数都是现成的拿来当练习底稿正合适——先照着跑一遍再逐个改参数看变化比对着空白界面干想要快得多。我第一次学这块的时候图省事跳过了“对账”这一步代码画一张、模型搭一个两边都跑通了就以为学会了。结果做课程设计时被一个符号问题卡了整整两天最后发现是模块里分母常数项写成了负数图上看就是一条缓慢发散的线而我当时根本没意识到那条线是在发散还以为是自己仿真时间设太短。从那以后我每次搭完模型都强制走一遍“先看零极点、再看阶跃、最后和脚本结果对一遍”的流程再也没有被这种低级问题拖住过。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?