☰
MATLAB时域分析实战:从传递函数到动态与静态特性
2026/10/13 11:25:22 网站建设 项目流程

做控制系统分析的人应该都经历过这种时刻:模型搭好,阶跃响应图跑出来,对面抛来一句“这个系统到底行不行?”。快不快、稳不稳、准不准,三个问题对应到自控原理里,就是动态特性和静态特性的分析。最近我接手了一个位置随动系统的分析任务,模型不算复杂,但要把超调量、上升时间、峰值时间、调整时间、稳态误差这几项指标给全、给准、能跟理论对得上,还是有不少细节值得说道。这篇文章我会用MATLAB把这条分析路线完整走一遍:从建立传递函数开始,到stepinfo批量计算时域指标,再到静态特性里最容易被忽略的稳态误差,最后聊几个实操中容易踩的坑。

1. 先用一个能贯穿全文的例子把系统立起来:位置随动系统的传函与稳定性检查

1.1 为什么选这个模型:一个带积分加惯性环节的典型结构

我用的例子是一个简化后的位置随动系统,开环传递函数是:

G(s) = 20 / (s(s+2))

这个传函非常典型:一个积分环节来自电机角速度到角位置的折算,一个一阶惯性环节来自电机电气/机械时间常数,20是前向通道增益。单位负反馈之后,闭环传递函数是:

T(s) = G(s) / (1 + G(s)) = 20 / (s² + 2s + 20)

把它和二阶系统标准式 ωn² / (s² + 2ζωn s + ωn²) 对照,能得到固有频率 ωn = √20 ≈ 4.47 rad/s,阻尼比 ζ = 2 / (2·√20) ≈ 0.224。这是一个典型的欠阻尼低阻尼系统,超调会很明显,用来做动态指标分析再合适不过。

为什么不直接给一个花哨的高阶系统?因为二阶欠阻尼系统有完整的解析公式可以验证MATLAB计算结果,方便我们确认软件给出来的数值到底靠不靠谱。等这套验证逻辑建立起来,再去分析高阶系统心里才有底。

1.2 MATLAB里建模型,第一步先做稳定性预检查

模型在MATLAB里建立起来非常简单,但我强烈建议先做稳定性检查,再谈后面的指标:

s = tf('s'); G = 20/(s*(s+2)); T = feedback(G, 1); % 稳定性检查 isstable(T) pole(T)

极点输出为 s = -1 ± 4.36j,实部为负,系统稳定。这个检查务必放在最前面,因为不稳定系统的阶跃响应是发散的,讨论调整时间、稳态误差都没有意义。我见过有人拿着一个不稳定模型直接跑step,看到曲线飞上去还以为是增益不够,实际上问题出在系统本身。

这里有一个建模顺序上的建议:用feedback指令生成闭环系统,而不是手工展开写成 T = 20/(s²+2s+20)。理由是feedback保留了单位反馈的结构信息,后面的误差传递函数分析可以直接复用开环对象 G,而且高阶系统手工展开很容易抄错系数。我自己的习惯是,开环系统、闭环系统、误差传递函数各存一个变量,后面求稳态误差时可以随时调用。

2. 动态特性四项指标:从解析公式到stepinfo实测对照

2.1 超调量和峰值时间:欠阻尼系统才有的“专属指标”

超调量的定义是响应超过稳态值的最大偏差占稳态值的百分比:

σ% = (yp - yss) / yss × 100%

对于标准二阶欠阻尼系统,理论公式是 σ% = exp(-πζ / √(1 - ζ²)) × 100%。把 ζ=0.224 代进去,计算结果是 σ% ≈ 48.65%。这意味着系统在阶跃输入下会冲到稳态值的1.49倍左右再回落,这个“冲过头”的程度就是超调量。

峰值时间 tp 是响应从零开始第一次到达峰值的时间,理论公式 tp = π / ωd,其中 ωd = ωn√(1 - ζ²) 是阻尼振荡频率。本例中 ωd = 4.47 × 0.974 ≈ 4.36 rad/s,所以 tp ≈ 3.1416 / 4.36 ≈ 0.72s。

这两个指标一起看,能快速判断一个系统的“反应性格”:峰值时间短说明系统反应快,超调量大说明系统平稳性差。工程上很多场合都在这两个指标之间做妥协,这也是后面做控制器校正时的主要矛盾。

2.2 上升时间和调整时间:定义口径必须先弄清楚

上升时间 tr 的定义在教材和软件之间经常打架。国内教材对欠阻尼系统常定义为“响应从0第一次到达稳态值的时间”,公式是 tr = (π - β) / ωd,其中 β = arccos ζ。而MATLAB的stepinfo默认使用的是10%到90%稳态值的时间,也就是 RiseTimeLimits = [0.1 0.9]。

这两种定义算出来的数值不一样。拿本例来说,0→100%定义的 tr ≈ (3.1416 - 1.364) / 4.36 ≈ 0.41s,而10%→90%定义大约在0.36s左右。数值看着接近,但换一个阻尼比更小的系统,两者差异会明显拉开。写分析报告时必须写清楚自己用的是哪种定义,否则别人复现你的数据时会一头雾水。

调整时间 ts 是响应进入并保持在某个误差带内所需的最短时间。MATLAB默认使用2%误差带,也就是响应进入稳态值的±2%区间后不再越界。本例 ζωn ≈ 1.0,用常用的近似公式 ts ≈ 4/(ζωn) ≈ 4s;考虑包络线更精确的估算约在3.9s左右。MATLAB的settling time就是按这个“进入后不再越界”的逻辑实时计算的,数值会跟包络公式略有出入。

2.3 stepinfo 实操:一行命令拿全所有时域指标

上面这些公式算起来费劲,MATLAB的stepinfo可以一次全给你:

info = stepinfo(T)

输出类似:

info = struct with fields: RiseTime: 0.3568 SettlingTime: 3.8912 SettlingMin: 0.9802 SettlingMax: 1.0198 Overshoot: 48.6456 Undershoot: 0 Peak: 1.4865 PeakTime: 0.7208

字段含义和本例对应的数值整理如下:

字段含义本例数值
RiseTime上升时间(10%→90%)≈0.36s
SettlingTime调整时间(2%误差带)≈3.89s
Overshoot超调量(百分比)≈48.65%
Peak峰值≈1.487
PeakTime峰值时间≈0.72s
SettlingMin/Max进入误差带后的最小/最大响应值≈0.98 / ≈1.02

注意SettlingMin和SettlingMax并不是响应的绝对最小值和最大值,而是进入误差带之后的极值范围。对2%误差带来说,它们应当落在[0.98, 1.02]附近,这恰恰说明了“进入误差带后不越界”的定义。如果你想改成5%误差带,用这个语法:

info5 = stepinfo(T, 'SettlingTimeThreshold', 0.05);

很多教材习题默认5%误差带,软件默认2%,做作业或者写实验报告时特别容易栽在这里。

把解析公式和stepinfo输出放在一起对照:

指标解析估算stepinfo实测结论
超调量48.65%48.65%一致
峰值时间0.72s0.72s一致
调整时间≈3.9s3.89s一致

这一步验证非常重要。它告诉我软件的计算逻辑和理论公式是吻合的,后面遇到复杂系统时,我就可以放心用stepinfo作为主要工具,而不用再手算二阶公式了。

3. 动态指标不一定要靠代码读:图纸上的交互式标注效率更高

3.1 右键菜单里的Characteristics功能,很多人没用过

stepinfo虽然能把指标一次列全,但有时候你更想知道这些指标在曲线上的哪个位置,尤其是峰值点和调整时间点。这时候根本不用自己写代码找点,MATLAB的step图自带交互式标注:

figure; step(T);

在图上右键,选择 Characteristics(特性),依次勾选:

  • Peak Response:标注峰值点和峰值时间
  • Settling Time:标注调整时间对应的点
  • Rise Time:标注上升时间区间
  • Steady State:标注稳态值

图上会出现实心圆点标记,鼠标悬停或者点击就能看到具体数值。这比自己在图上拿光标估读精确得多,也比查stepinfo字段直观得多。

3.2 用Linear System Analyzer做多系统对比

如果手上有好几组参数,想对比不同阻尼比、不同增益下的动态指标,可以用线性系统分析器:

linearSystemAnalyzer('step', T)

在弹出的界面里,右键同样可以调出特性标注,而且可以同时载入多个系统进行对比。比如把ζ=0.224的系统和ζ=0.5、ζ=0.8的系统放一起,一眼就能看出“阻尼比越大,超调越小,但上升时间变长”这个经典结论。这个工具在课程设计、答辩前调试参数时特别实用,不用反复写循环输出一堆数字。

3.3 为什么要坚持“数值+图形”双验证

我个人的习惯是,算完stepinfo之后一定会在图上再点一遍标注,两者对上号才算数。这么做不是多此一举,而是真的救过我的场。

有一次我给一个系统分析动态指标,理论公式套到一半发现阻尼比算成了1.26,但系统明显有超调,曲线图上都看得到振荡。如果只看数字,震荡的数据会让报告非常别扭;但把图上特性标注点出来,超调量、峰值一目了然,立刻就能回头检查是不是公式里的参数抄错了。图形标注不只是给人看的,它更是一种快速定位错误的校验手段。

4. 静态特性才是稳态误差:单位反馈下的三种求解路线

4.1 误差从哪里来:系统型别和输入信号决定一切

动态特性回答“稳不稳、快不快”,静态特性回答“准不准”。这里的核心指标就是稳态误差。误差定义为:

e(t) = r(t) - y(t)

当 t→∞ 时 e(t) 的极限值就是稳态误差 ess。它由两部分决定:系统的型别(开环传递函数中积分环节的个数)和输入信号的类型。

自动控制原理里有一个必须烂熟于心的表,按0型、I型、II型系统分类:

系统型别单位阶跃输入单位斜坡输入单位抛物线输入
0型1/(1+Kp)∞∞
I型01/Kv∞
II型001/Ka

其中静态位置误差系数 Kp = lim(s→0) G(s),静态速度误差系数 Kv = lim(s→0) sG(s),静态加速度误差系数 Ka = lim(s→0) s²G(s)。本例中的开环系统 G(s) = 20/(s(s+2)) 含有一个积分环节,属于I型系统。所以理论上:

  • 单位阶跃输入下的稳态误差为0;
  • 单位斜坡输入下的稳态误差为 1/Kv。Kv = lim(s→0) 20/(s+2) = 10,所以 ess = 1/10 = 0.1。

4.2 路线一:终值定理和符号极限

从传递函数层面严格求解稳态误差,可以用终值定理。误差的拉氏变换为 E(s) = Ge(s)·R(s),其中 Ge(s) = 1/(1+G(s)) 是误差传递函数。稳态误差 ess = lim(s→0) s·E(s)。

对单位阶跃输入,R(s)=1/s,所以 s·E(s) = Ge(s),直接求 Ge(s) 在 s=0 的极限即可;对单位斜坡输入,R(s)=1/s²,此时 s·E(s) = Ge(s)/s。

在MATLAB里用符号运算可以把这个极限过程完整呈现:

syms s G_sym = 20/(s*(s+2)); Ge_sym = 1/(1 + G_sym); % 误差传递函数 % 单位阶跃输入下的稳态误差 ess_step = limit(Ge_sym, s, 0) % 单位斜坡输入下的稳态误差 ess_ramp = limit(Ge_sym/s, s, 0)

运行结果分别是 ess_step = 0 和 ess_ramp = 1/10 = 0.1,与理论完全一致。符号极限的方法优点是一步到位,而且不需要额外仿真,缺点是要引入符号变量,对复杂的系统写起来有点繁琐。

4.3 路线二:用dcgain和静态误差系数快速估算

如果不涉及符号计算,单纯想快速得到误差系数和稳态误差,可以直接用dcgain:

Kp = dcgain(G); % 本例G含积分环节,结果为Inf,0型系统才有意义 Kv = dcgain(s*G); % 结果为10 Ka = dcgain(s^2*G); % 结果为0

然后把结果代入误差公式表即可。这里有一个使用边界:dcgain本质是求系统在s=0处的增益,如果对象内部还有积分环节,结果会是Inf,不代表错误,而是在提醒你“这个环节在零频处增益无穷大”。比如0型系统求Kv时,dcgain(s*G)会得到0,对应斜坡输入下稳态误差无穷大,逻辑上是自洽的。

还有一种更直接的dcgain用法是求闭环系统的误差传递函数增益:

Ge_tf = 1/(1 + G); ess_step_dcgain = dcgain(Ge_tf) % 结果为0,对应阶跃输入

这个式子本质就是终值定理在阶跃输入下的特例,因为 s·E(s) = Ge(s),而dcgain就是在求s=0处的值。

4.4 路线三:用lsim仿真直接看误差曲线的尾巴

前面的方法都偏“解析”,如果你想知道误差随时间实际怎么衰减,最直观的方法是直接仿真误差信号。用闭环系统T跑单位斜坡响应,再和输入信号相减:

t = 0:0.01:30; r = t; % 单位斜坡输入 y = lsim(T, r, t); e = r - y; plot(t, e); grid on; xlabel('t (s)'); ylabel('e(t)');

仿真曲线会清楚地显示:误差从0附近开始,经过短暂振荡后稳定在0.1附近。这个0.1就是斜坡输入下的稳态误差。用这种方法的好处是,它把“理论上的极限值”变成了“实际图形上看得见的尾巴”,对于验证性和教学性分析非常友好,也适合在报告里放图说明。

4.5 非单位反馈的坑:误差传递函数不能照抄公式

上面所有推导都建立在单位反馈假设上。如果实际系统的反馈通道不是1,而是一个传感器传递函数 H(s),那么闭环输出 T(s) = G(s)/(1+G(s)H(s)) 不再是简单的 G/(1+G)。此时如果还用 1/(1+G) 作为误差传递函数,结果必然错误。

正确做法是直接从定义出发:E(s) = R(s) - Y(s),所以 Ge(s) = 1 - T(s)。阶跃输入下的稳态误差可以直接用 dcgain(1-T) 求得。举个例子,假设反馈通道 H=1.2,则:

H = 1.2; T2 = feedback(G, H); ess_sensor = dcgain(1 - T2) % 约为0.1667

结果和单位反馈下的0完全不同。非单位反馈在真实工程里很常见,传感器增益不等于1的情况比比皆是,用错公式会让整个分析白做,这里务必小心。

5. 实际分析中我会特别注意的几个坑:仿真时长、定义口径与高阶系统近似

5.1 step的自动仿真时间有时候会“截断”调整时间

MATLAB的step指令不指定时间范围时,会自动选一个结束时间。在大多数情况下这个时间是够用的,但如果你遇到一个慢系统,或者阻尼比特别小的系统,自动选的时间可能刚好停在误差带边缘,导致settling time计算偏小。

我遇到过这种情况:系统本来就衰减得慢,自动仿真的结束时间在10秒左右,曲线尾端还有轻微波动,stepinfo报出来的调整时间明显偏小。后来统一改成手动指定时间范围,问题立刻消失:

t = 0:0.01:30; step(T, t); info_manual = stepinfo(y, t);

这里的经验是:别完全信任自动时间,先跑一版看曲线,如果尾部看起来还没有完全“平静”,就拉长时间再算一次。调整时间这个指标对仿真时长最敏感,多花两行代码能避免报告数据出大错。

5.2 写报告时一定要标注指标定义口径

前面反复提到上升时间定义和误差带宽的选择,这里我要专门强调一下:在实际交付的分析报告中,定义口径不统一是同行之间最常扯皮的地方。

比如同样一个系统,你说上升时间是0.36s,我用0→100%定义算出来是0.41s,两个人对数据谁对谁错争半天,最后发现只是定义不同。再比如调整时间,MATLAB默认2%误差带,有些行业规范和企业标准用的是5%误差带,数值相差接近20%。

我的做法是在报告的第一时间就写清楚:

  • 上升时间采用10%→90%稳态值定义;
  • 调整时间采用2%误差带;
  • 峰值时间为首次到达峰值的时间。

这样读者拿到后面所有数值,都能明确知道这些数字是怎么量出来的。不要觉得这是废话,越严谨的定义说明越能避免后面返工。

5.3 高阶系统分析:主导极点近似和“指标打架”的应对

前面所有解析验证都是基于二阶系统,但实际工程模型很少是标准的二阶。处理高阶系统时,我的习惯是先看零极点分布,找到一对共轭复数主导极点,然后忽略那些离虚轴很远、对动态过程影响很小的极点和零点,把系统近似成二阶系统来分析。

判断主导极点有一个粗略标准:非主导极点的实部模值如果是主导极点实部模值的5倍以上,就可以近似忽略。用MATLAB命令:

pzmap(T);

一眼就能看到从虚轴往左排开的极点位置,哪些是主角、哪些是龙套非常清楚。

另外,实际系统里阻尼、增益带来的“指标打架”是常态:想减小稳态误差就提高开环增益,结果超调变大、调整时间变长;想减小超调就降低增益,结果响应变慢。分析完动态特性和静态特性之后,常会发现自己手里是一个“顾此失彼”的原始系统。这恰恰说明下一步该做校正了——超前校正、滞后校正或者PID整定,本质上都是在这些指标之间找平衡点。

最后分享一个我做这类分析收尾时的小习惯:把stepinfo的输出和图上特性标注核对一遍,再把稳态误差的理论计算结果用一次斜坡仿真验证一遍,前前后后不超过十分钟,但能保证报告里每一个数字都经得起别人推敲。控制系统分析这个东西,公式背得熟不如验证做得勤,尤其是面对一个新给到的模型时,多花十分钟建立“理论—软件—图形”三条交叉印证的全链路,后面发现问题的概率会小很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询