简介:二阶系统时域分析是自动控制原理课程中的典型实验,这份文档完整呈现了从数学建模到实验仿真的全过程。内容涵盖二阶系统传递函数推导、劳斯判据稳定性验证、单位阶跃输入下的稳态误差计算,以及超调量、调节时间等动态性能指标分析;同时记录了可调电阻为10千欧和110千欧两种参数下的实测波形,并与理论值、仿真结果做了对比,能帮助读者理解欠阻尼二阶系统的响应特征及误差来源。报告从原理出发,一步步展示从电路方程到闭环传递函数的推导思路,并附有劳斯表构造过程和阶跃响应曲线特征说明,便于自学者按步骤核对。资源为单个Word文档,约808KB,适合自动化、电气等专业的学生作为实验报告模板或复习参考。这份报告已在CSDN上被2225人浏览学习,对于正在完成同类实验、需要规范报告结构或核对计算方法的读者很有参考价值。
1. 二阶系统时域分析为什么是自动控制原理实验里的第一道坎
做过自动控制原理实验的人大多有这种体验:二阶系统时域分析这一节,课上阻尼比、自然频率、超调量算得清清楚楚,进了实验室,阶跃曲线在示波器上冲出来,峰值好像有,又似乎被噪声吃掉了一点,尺子量完再和公式对照,误差总在“能解释”和“不太好解释”之间晃。问题往往不是计算器按错,而是对峰值时间 tp、超调量 Mp、调节时间 ts 这几个性能指标的定义边界掌握得不够——读数该取峰顶还是包络线,调节时间按 2% 还是 5% 容差,反推阻尼比时激励是否真的保持了线性二阶条件。这篇文章把从传递函数到实验报告的整条路径梳理一遍,给出能在 MATLAB/Simulink 里直接复现的脚本和参数提取方法,也把实验数据回推 ζ、ωn 的坑讲清楚,适合自动化、机器人、嵌入式方向准备控制类实验或课程设计的人对照操作。
2. 二阶系统传递函数与特征参数:先把时域指标体系立住
2.1 标准型传函里为何只保留阻尼比和自然频率
二阶系统时域分析里几乎所有结论都建立在一个标准式上:
G(s) = ωn² / (s² + 2ζωn·s + ωn²)ωn 是自然角频率,ζ 是阻尼比。这两个参数不是凭空定义出来的抽象概念,它们直接映射到实际物理环节。电机转速闭环、质量-弹簧-阻尼系统、RLC 无源滤波器,只要系统在关注频带内表现为“一个惯性环节串联一个储能环节”,就能化成这个结构。实验室里最常见的被测对象是 RLC 串联电路,电容电压对输入电压的传递函数是:
G(s) = (1/LC) / (s² + (R/L)s + 1/LC)对照标准式得到:
ωn = 1 / √(LC) 2ζωn = R / L,即 ζ = (R/2)·√(C/L)这组关系是实验设计的第一依据:调电阻 R 直接调阻尼比,改 L 和 C 改变自然频率。给实验报告写“被测对象参数”时,通常先把这组式子列出来,再给出实际元件值。
一个容易忽略的前提是:标准式隐含单位负反馈和线性时不变假设。如果实验中系统处于开环测量状态,或者输入幅值大到进入饱和区,模型的适用性就要重新评估。后面第 3.3 节会专门讨论这一点。
2.2 欠阻尼响应解析式与四项时域指标的推导
当 0 < ζ < 1 时,系统有一对共轭复根,单位阶跃响应的完整表达式是:
y(t) = 1 - [e^(-ζωn·t) / √(1-ζ²)] · sin(ωd·t + φ)其中:
ωd = ωn·√(1-ζ²) φ = arctan(√(1-ζ²) / ζ)ωd 是阻尼振荡频率,它决定了曲线相邻两个波峰之间的距离。由这个式子上包络线和三角函数的极值条件,可以推出四个经典时域指标:
| 指标 | 公式 | 含义 |
|---|---|---|
| 峰值时间 tp | π / ωd | 第一次到达最大值的时间 |
| 超调量 Mp | exp(-ζπ/√(1-ζ²)) × 100% | 峰值超出稳态值的百分比 |
| 调节时间 ts | 4 / (ζωn)(2% 容差) | 曲线进入并保持误差带 |
| 上升时间 tr | (π - φ) / ωd | 首次从 0 上升到稳态值 |
注意,ts 的 4/(ζωn) 是包络线近似,不是解析解。如果报告要求 5% 容差,则换成 3/(ζωn)。同一系统按两种容差读数,ts 差出约 33%,报告中必须写明。
为了快速核对数值,可以用一段 Python 计算:
import numpy as np zeta = 0.5 # 阻尼比 wn = 10.0 # 自然频率 rad/s wd = wn * np.sqrt(1 - zeta**2) tp = np.pi / wd Mp = np.exp(-zeta * np.pi / np.sqrt(1 - zeta**2)) * 100 ts = 4 / (zeta * wn) # 2% 容差 print(f"tp = {tp:.4f} s") print(f"Mp = {Mp:.2f} %") print(f"ts = {ts:.4f} s")这组指标只对 0 < ζ < 1 成立。ζ 接近 1 时,振荡周期趋近无穷大,tp 的“峰”不再明显;ζ 小于 0.2 时,系统振荡次数多,实验中数字示波器的采样率就开始影响读数精度。后面分析实验数据时,先判断响应属于哪个阻尼区间,是比直接套公式更重要的一步。
2.3 阻尼比对响应形态的影响与实验可观测边界
把 ζ 分成四个区间看,实验现象完全不同:
| ζ 区间 | 特征根分布 | 阶跃响应形态 | 实验可见现象 |
|---|---|---|---|
| ζ = 0 | 纯虚根 | 等幅振荡 | 曲线不衰减,数字示波器上呈稳定正弦 |
| 0 < ζ < 1 | 共轭复根 | 衰减振荡,有超调 | 峰值、包络线、次峰依次可见 |
| ζ = 1 | 重实根 | 无超调、最快收敛 | 临界状态,元件参数极难精确复现 |
| ζ > 1 | 两个负实根 | 单调上升 | 无明显超调,tp 和 Mp 指标失去意义 |
实验开始时先用阶跃信号扫一版,肉眼看曲线形态。如果观察到单调上升且无回冲,说明系统落在过阻尼区,强行按欠阻尼公式反推 ζ 会算出虚数来。这样一种“先看形态、再套公式”的习惯,能省掉后面大量对不上的时间。
3. 用 MATLAB/Simulink 复现二阶系统时域曲线并提取指标
3.1 step 与 stepinfo 的最小验证脚本
做实验前先在 MATLAB 里跑一遍理论曲线,是确认后续读数算法是否可靠的最快路径。下面这段脚本是从零开始解析响应曲线并提取 tp、Mp、ts,再和 MATLAB 自带stepinfo的结果对照:
% 二阶系统时域分析最小仿真脚本 zeta = 0.4; % 阻尼比 wn = 10; % 自然频率 rad/s G = tf([wn^2], [1, 2*zeta*wn, wn^2]); t = 0:1e-4:2; % 仿真 2 秒,步长 0.1 ms y = step(G, t); % 单位阶跃响应 % 提取峰值时间和超调量 [ymax, idx] = max(y); tp = t(idx); Mp = (ymax - 1) * 100; % 稳态值为 1 % 提取调节时间:最后一次越过 2% 误差带的时刻 idx_ts = find(abs(y - 1) > 0.02, 1, 'last'); ts = t(idx_ts); % 与 MATLAB 自带函数对照 info = stepinfo(G); fprintf('stepinfo: tp=%.4f, Mp=%.2f%%, ts=%.4f\n', ... info.PeakTime, info.Overshoot, info.SettlingTime); fprintf('手动提取: tp=%.4f, Mp=%.2f%%, ts=%.4f\n', tp, Mp, ts);参数说明:
tf([wn^2], [1, 2*zeta*wn, wn^2])第一个向量是分子系数,第二个是分母系数,注意分母从 s² 项开始写,顺序不能错。t = 0:1e-4:2决定峰值读数的分辨率。ζ=0.4、ωn=10 时 tp 在 0.34s 附近,0.1ms 步长带来的误差不到 0.03%,够用。如果 ζ 很小,振荡周期变长,步长要再缩一个量级。find(..., 1, 'last')返回的是最后一次越过 2% 误差带的时刻,比“第一次进入误差带”更贴近运行到最终调节时间的教科书定义。手动画线时容易把第一次越过 0.98 当成 ts,两者之间会差出一个振荡周期。stepinfo输出的 Overshoot 已经是百分比形式。它内部同样依赖步进求解精度,所以步长太粗时也会偏离理论值。
提示:使用
stepinfo前先确认系统稳态值为 1。如果传递函数分子是 K,稳态值不是 1,超调量结果会整体偏移,先用dcgain归一化再交给函数。
3.2 Simulink 模型搭建与滚动实验
仿真通过后再搭 Simulink 模型,用途是快速改参数看曲线形态变化。常见做法是放四个模块:Step 信号源、Transfer Fcn、Scope、To Workspace。
| 配置项 | 推荐值 | 作用 |
|---|---|---|
| Step time | 0 | 阶跃在 0 时刻接入 |
| Initial value | 0 | 零初值条件 |
| Final value | 1 | 单位阶跃 |
| Transfer Fcn Numerator | [wn^2] | 增益补偿,稳态值为 1 |
| Transfer Fcn Denominator | [1, 2zetawn, wn^2] | 标准二阶分母 |
| Solver | ode45 | 默认自适应步长足够 |
| Max step size | 1e-3 | 防止峰值被大步长跳过 |
模型中 To Workspace 输出 y 和 tout,方便把数据取回工作区做指标提取。Scope 只用来观察,不能直接导出数据——这一步是很多人写实验报告时才发现的坑。
在 Simulink 里反复改 ζ 从 0.2 到 0.8,可以直观看到峰值逐渐变矮、振荡次数减少。建议每次改完把 y 存成不同的数组变量,比如y_zeta02、y_zeta05,避免覆盖后还要重新仿真。
3.3 噪声滤波和线性边界对读数的影响
实测曲线不会像仿真那么干净。传感器噪声和示波器量化误差会让峰值附近出现毛刺,直接影响max(y)的结果。实验室常用滑动平均做预处理:
% 滑动平均平滑实测曲线 y_smooth = movmean(y, 15); % 窗口设为 15 个采样点 [ymax, idx] = max(y_smooth);窗口越大,曲线越平,但峰值时间会被人为滞后。实测信号采样率如果是 1kHz,15 点窗口对应 15ms 的延迟,对 tp 在 300ms 量级的系统误差约 5%,尚可接受;如果 tp 本来就短,窗口要缩到 5 以内。
还需要确认系统处于线性区。把阶跃幅值从 1V 降到 0.5V,再跑一次,看峰值附近形态是否成比例。超调百分比不变说明线性假设成立;超调明显变小甚至消失,说明系统里存在饱和或死区,此时整条曲线应该重新在小信号下测量。
4. 从实验曲线反推 ωn 与 ζ 并核对报告结论
4.1 用超调量和峰值时间反向求系统参数
时域分析实验报告里最实用的操作,是根据实测曲线反向求阻尼比和自然频率。由超调量公式反解 ζ:
令 Mp_frac = Mp% / 100 ζ = sqrt( ln²(Mp_frac) / (π² + ln²(Mp_frac)) )再由峰值时间反推 ωd:
ωd = π / tp ωn = ωd / √(1 - ζ²)把超调量转成小数再取对数,是因为公式里的 Mp 指百分比除以 100。这个转换错误是实验报告里最常出现的低级失误。算出来的 ζ 和 ωn 还可以继续用来估算 ts,和曲线上的实测值对照。
下面是处理实测读数的一段 MATLAB 代码:
% 根据实测曲线反推二阶系统参数 Mp_pct = 16.3; % 从曲线上读出的超调量 % tp_meas = 0.31; % 峰值时间 s Mp_frac = Mp_pct / 100; zeta = sqrt(log(Mp_frac)^2 / (pi^2 + log(Mp_frac)^2)); wd = pi / tp_meas; % 阻尼振荡频率 wn = wd / sqrt(1 - zeta^2); % 自然频率 ts_est = 4 / (zeta * wn); % 2% 容差调节时间 fprintf('zeta = %.3f\n', zeta); fprintf('wn = %.3f rad/s\n', wn); fprintf('ts = %.3f s\n', ts_est);注意 log 在 MATLAB 里默认是自然对数,Python 里要用 math.log,不要写成 log10。
4.2 一组可查表的算例
用三组不同阻尼状态做完整换算,结果如下:
| 超调量 Mp% | 峰值时间 tp(s) | ζ 计算值 | ωn 计算值(rad/s) | ts 估算值(s) |
|---|---|---|---|---|
| 16.3% | 0.31 | 0.500 | 11.70 | 0.684 |
| 25.4% | 0.24 | 0.400 | 14.29 | 0.700 |
| 9.5% | 0.42 | 0.600 | 9.35 | 0.713 |
三组数据的 ts 估算值非常接近,原因是 ts 正比于 1/(ζωn),而 tp 又反比于 ωd,两个方向的变化彼此补偿。这说明实验报告里只写调节时间不写阻尼比,会掩盖掉系统在 ζ 上的巨大差异。反过来,如果你做实验时发现不管怎么调参数 ts 都差不多,也要警惕是不是类似补偿关系把差异抹平了。
4.3 理论值与实测值之间的差异来源
报告结论与理论曲线不一致,通常可以从四个方向找原因:
- 采样分辨率:峰值时间是离散采样序列里的最大值对应时刻,实际真实峰值可能落在两次采样之间,误差最多可达半个采样周期。
- 容差定义:2% 和 5% 误差带对应 ts 公式系数一个用 4 一个用 3,报告里如果漏写容差,复核的人会按错误公式反推。
- 系统阶次偏高:被测对象可能不是纯二阶,额外小惯性环节会让响应边沿变缓,超调量偏小,此时反推出的 ζ 偏大。可先对比响应上升段斜率,判断是否存在明显的高频环节。
- 激励条件:输入幅值过大使系统进入非线性区,响应曲线头部被限幅削平,超调量读数失真。小信号重测是对这一项最直接的检验。
写实验报告时,建议把以上差异来源列在结论前,而不是单纯写“实测与理论基本吻合”。评阅人更看重你有没有解释清楚误差去向。
5. 用重建曲线验证二阶系统参数提取是否正确
5.1 重建传递函数并与原始曲线叠加对比
有一个容易被忽略但非常实用的验证方法:把反推出来的 ζ 和 ωn 放回传递函数,重新算一次阶跃响应,再把这条重建曲线和原始实测曲线叠在同一张图里。重合度高的反推才可信,只靠单一指标对上号往往掩盖了模型结构错误。
% 重建二阶系统并与原始曲线对比 zeta_est = zeta; % 第 4 节反推的阻尼比 wn_est = wn; % 第 4 节反推的自然频率 G_est = tf([wn_est^2], [1, 2*zeta_est*wn_est, wn_est^2]); t = 0:1e-4:2; y_est = step(G_est, t); figure; plot(t, y, 'k-', 'LineWidth', 2); hold on; plot(t, y_est, 'r--', 'LineWidth', 1.2); legend('实测响应', '重建二阶系统', 'Location', 'southeast'); xlabel('时间 (s)'); ylabel('输出 y(t)'); grid on;如果重建曲线在峰值和振荡周期上都能贴合原始曲线,说明二阶模型假设成立;如果峰值对上了但振荡频率差一截,多半是 ωn 换算错了;如果周期对得上但超调量偏差很大,问题出在 ζ 或稳态值归一化上。进一步量化可以用误差均方根:
rmse = sqrt(mean((y - y_est).^2));rmse 在稳态值 1 的量级下小于 0.05,整条曲线的拟合已经足够好,可以直接把结果写进实验报告。
5.2 三条自查规则:容差、峰值、线性
最后给三条可以快速套用的自查规则:
- 调节时间先定容差。报告写 2% 容差就用 4/(ζωn),写 5% 就用 3/(ζωn),两条不能同时出现在一份报告里。
- 超调量只认第一次峰值。后续振荡产生的局部极值如果超过第一次峰值,说明存在测量毛刺或非线性因素,不应直接计入 Mp。
- 反推 ζ 前先做减幅验证。把输入幅值减半再测一次,超调百分比不变才说明系统处于线性区,反推的 ζ 才有意义。
重建曲线的脚本可以直接做成一个函数文件,输入实测 y 和 t,输出 ζ、ωn、rmse,实验收尾时把三组数据都跑一遍,保留 rmse 最小的那组结果放进报告附录,参数上报才有底气。
本文还有配套的精品资源,点击获取