从零到一:基于Matlab的二阶系统时域性能指标计算与可视化实战

📅 发布时间:2026/7/16 18:45:41 👁️ 浏览次数:
从零到一:基于Matlab的二阶系统时域性能指标计算与可视化实战
1. 为什么你需要掌握二阶系统的时域分析如果你正在学习自动控制原理或者你的工作涉及到电机控制、机器人、无人机、汽车悬架等任何动态系统那么“二阶系统”这个词你一定不陌生。它就像控制理论里的“Hello World”是理解更复杂系统的基础。但很多朋友学到这儿就卡住了书上公式一大堆什么超调量、调节时间、峰值时间看着都头疼更别说自己动手算、动手画了。我刚开始学的时候也这样感觉理论是一回事实际应用是另一回事。直到我开始用Matlab才发现事情变得简单多了。Matlab就像一个超级计算器和画图板能把那些抽象的公式瞬间变成直观的曲线和具体的数字。今天我就带你从零开始手把手教你如何用Matlab把一个二阶系统的传递函数变成一系列清晰的性能指标和对比图。学完这篇你不仅能看懂理论更能自己动手分析、优化任何一个二阶系统。简单来说二阶系统描述了很多现实世界中“有惯性、有阻尼”的物理过程。比如一个弹簧-质量-阻尼系统或者一个RLC电路。它的核心就两个参数自然频率ωn和阻尼比ζ。这两个参数就像系统的“DNA”决定了它对外界输入比如一个突然的指令会做出什么样的反应——是迅速而平稳地到位还是剧烈振荡半天都停不下来。我们的目标很明确给你一个传递函数你能用Matlab快速算出它的关键性能指标并画出响应曲线通过对比不同参数下的曲线一眼看出好坏。这套方法无论是做课程设计、毕业设计还是在实际工程中快速评估控制器性能都极其有用。2. 从理论到代码核心公式与Matlab实现在动手敲代码之前我们得先搞清楚要算些什么。对于一个欠阻尼0 ζ 1的二阶系统我们最关心的四个时域指标是上升时间Tr、峰值时间Tp、超调量OS%和调节时间Ts。它们分别描述了系统响应的“快慢”和“稳不稳”。这里我把最核心的公式给你列出来并且直接配上Matlab的计算代码。别怕公式我们目的是用它不是推导它。1. 超调量 (Overshoot, OS%)这个指标衡量系统响应第一次冲过最终稳态值的最大幅度。公式是OS% exp(-π * ζ / sqrt(1 - ζ^2)) * 100%在Matlab里计算起来非常简单zeta 0.5; % 阻尼比 OS_percent exp(-pi * zeta / sqrt(1 - zeta^2)) * 100; fprintf(超调量为%.2f%%\n, OS_percent);2. 峰值时间 (Peak Time, Tp)系统响应达到第一个峰值所需要的时间。Tp π / (ωn * sqrt(1 - ζ^2))Matlab代码wn 3; % 自然频率单位 rad/s Tp pi / (wn * sqrt(1 - zeta^2)); fprintf(峰值时间为%.3f 秒\n, Tp);3. 调节时间 (Settling Time, Ts)系统响应进入并保持在最终稳态值一定误差带通常为±2%内所需的时间。常用近似公式Ts 4 / (ζ * ωn)针对2%误差带 Matlab代码Ts 4 / (zeta * wn); fprintf(调节时间(2%%)为%.3f 秒\n, Ts);4. 上升时间 (Rise Time, Tr)响应从稳态值的10%上升到90%所需的时间。有一个常用的近似公式Tr ≈ (π - arccos(ζ)) / (ωn * sqrt(1 - ζ^2))Matlab代码Tr (pi - acos(zeta)) / (wn * sqrt(1 - zeta^2)); fprintf(上升时间(10%%-90%%)为%.3f 秒\n, Tr);看到这里你可能想问这些公式算得准吗我得说对于典型的欠阻尼二阶系统这些公式给出的理论值非常接近实际响应。尤其是超调量和峰值时间的公式是精确的。调节时间和上升时间的公式是工程上常用的近似在初步设计和分析中完全够用而且计算速度极快。在实际项目中我经常先用这些公式快速估算性能心里有底了再去跑详细的仿真。2.1 封装成函数一键计算所有指标每次都重复写上面四行代码太麻烦了。一个好的习惯是把这些计算封装成一个Matlab函数。这样以后你只需要输入 ωn 和 ζ就能得到所有结果。function [OS_percent, Tp, Ts, Tr] calc_2nd_order_params(wn, zeta) % 计算二阶系统时域性能指标 % 输入 % wn: 自然频率 (rad/s) % zeta: 阻尼比 % 输出 % OS_percent: 超调量 (%) % Tp: 峰值时间 (s) % Ts: 调节时间 (s, 2%准则) % Tr: 上升时间 (s, 10%-90%近似) % 1. 计算超调量 OS_percent exp(-pi * zeta / sqrt(1 - zeta^2)) * 100; % 2. 计算峰值时间 Tp pi / (wn * sqrt(1 - zeta^2)); % 3. 计算调节时间 (2%) Ts 4 / (zeta * wn); % 4. 计算上升时间 (近似) Tr (pi - acos(zeta)) / (wn * sqrt(1 - zeta^2)); end保存这个文件为calc_2nd_order_params.m。使用时在命令窗口或脚本里直接调用[OS, Tp, Ts, Tr] calc_2nd_order_params(3, 0.5); fprintf(系统性能指标\n); fprintf( 超调量: %.2f%%\n, OS); fprintf( 峰值时间: %.3f s\n, Tp); fprintf( 调节时间: %.3f s\n, Ts); fprintf( 上升时间: %.3f s\n, Tr);是不是清爽多了这就是编程的魅力把重复劳动自动化。3. 实战第一步绘制单系统阶跃响应与指标标注理论算完了我们得用图形来验证。画出一个系统的阶跃响应曲线并把我们计算出的关键指标点在图上标出来这是最直观的学习方式。假设我们有一个二阶系统传递函数是 G(s) 9 / (s^2 3s 9)。你能看出来吗这里 ωn 3 rad/s ζ 0.5。我们就用它来演示。clc; clear; close all; % 清空环境好习惯 % 1. 定义系统参数并计算指标 wn 3; zeta 0.5; [OS, Tp, Ts, Tr] calc_2nd_order_params(wn, zeta); % 2. 创建传递函数并获取阶跃响应数据 num wn^2; den [1, 2*zeta*wn, wn^2]; sys tf(num, den); % 创建传递函数对象 % 模拟阶跃响应获取详细数据 t 0:0.01:10; % 时间向量从0到10秒步长0.01 [y, t_out] step(sys, t); % y是输出响应t_out是时间点和t基本一样 y_final dcgain(sys); % 系统的稳态终值 % 3. 找到峰值和超调量对应的实际数据点 [ypk, tpk_idx] max(y); % ypk是最大值tpk_idx是索引 Tp_actual t_out(tpk_idx); % 实际的峰值时间 OS_actual (ypk - y_final) / y_final * 100; % 实际的超调量百分比 % 找到上升时间10%-90% y_10 0.1 * y_final; y_90 0.9 * y_final; idx_10 find(y y_10, 1, first); idx_90 find(y y_90, 1, first); Tr_actual t_out(idx_90) - t_out(idx_10); % 找到调节时间2%误差带 y_upper 1.02 * y_final; y_lower 0.98 * y_final; % 找出从后往前看第一个超出误差带的时间点 idx_settle find(y y_lower | y y_upper, 1, last); if isempty(idx_settle) Ts_actual 0; else Ts_actual t_out(idx_settle); end % 4. 绘制阶跃响应曲线并标注 figure(Position, [100, 100, 900, 600]); % 设置图形窗口大小 plot(t_out, y, b-, LineWidth, 1.5); % 画响应曲线 hold on; grid on; % 画稳态值线 line([t_out(1), t_out(end)], [y_final, y_final], Color, k, LineStyle, --, LineWidth, 1); % 画误差带 plot(t_out, y_upper*ones(size(t_out)), k:, LineWidth, 0.8); plot(t_out, y_lower*ones(size(t_out)), k:, LineWidth, 0.8); % 标注峰值点 plot(Tp_actual, ypk, ro, MarkerSize, 8, MarkerFaceColor, r); text(Tp_actual0.1, ypk0.02, sprintf(峰值点 (T_p%.3fs, OS%.2f%%), Tp_actual, OS_actual), FontSize, 10); % 标注上升时间区间 plot([t_out(idx_10), t_out(idx_90)], [y(idx_10), y(idx_90)], g^, MarkerSize, 8, MarkerFaceColor, g); text(t_out(idx_90)0.2, y_90, sprintf(上升时间 T_r%.3fs, Tr_actual), Color, g, FontSize, 10); % 标注调节时间点 if Ts_actual 0 plot(Ts_actual, y(idx_settle), ms, MarkerSize, 8, MarkerFaceColor, m); text(Ts_actual0.2, y(idx_settle)-0.05, sprintf(调节时间 T_s%.3fs, Ts_actual), Color, m, FontSize, 10); end xlabel(时间 (s), FontSize, 12); ylabel(系统响应, FontSize, 12); title(sprintf(二阶系统阶跃响应 (\\omega_n%.1f, \\zeta%.2f), wn, zeta), FontSize, 14); legend(阶跃响应, 稳态值, 2%误差带, Location, best); % 5. 在图上以文本框形式显示理论计算值 dim [0.15, 0.15, 0.3, 0.2]; % 文本框位置和大小 [x, y, width, height] str {sprintf(理论计算值:), ... sprintf(超调量 OS %.2f%%, OS), ... sprintf(峰值时间 T_p %.3f s, Tp), ... sprintf(调节时间 T_s %.3f s, Ts), ... sprintf(上升时间 T_r %.3f s, Tr)}; annotation(textbox, dim, String, str, FitBoxToText, on, ... BackgroundColor, [0.95, 0.95, 0.95], EdgeColor, k, FontSize, 10);运行这段代码你会得到一张信息量丰富的图。蓝色的实线是系统的响应曲线。红色的圆圈标出了实际的峰值点和超调量。绿色的三角标出了上升时间的起点和终点。品红色的方块标出了系统进入并保持在2%误差带内的时间点调节时间。左上角的灰色框则列出了我们之前用公式计算的理论值。通过对比理论值和图上标注的实际值你会发现它们非常接近。这验证了我们公式的正确性也让你对“超调量”、“调节时间”这些抽象概念有了最直观的认识。我强烈建议你多改改wn和zeta的值比如把zeta改成0.2或者0.8重新运行一下亲眼看看曲线和指标是如何剧烈变化的。这种动手尝试的印象比看十遍书都深刻。4. 性能对比的艺术多系统可视化分析单独看一个系统还不够。在工程设计中我们总是在做权衡和选择。比如是追求更快的响应更小的Tr和Tp还是追求更平稳更小的OS这就需要我们把不同参数的系统放在一起对比。下面我们就来绘制一组系统的对比图并生成一个性能对比表格。我们将创建5个二阶系统它们的参数如下表所示。我们以一个“标准”系统ωn3 ζ0.5为基准通过改变ωn和ζ来观察性能的变化趋势。系统名称自然频率 ωn (rad/s)阻尼比 ζ设计意图标准系统30.5基准中等性能对比系统A60.866高ωn高ζ追求快速且平稳对比系统B60.25高ωn低ζ追求快速但振荡大对比系统C30.3同ωn低ζ观察ζ减小的影响对比系统D60.5高ωn同ζ观察ωn增大的影响clc; clear; close all; % 定义系统参数组 systems { {标准系统, 3, 0.5}, {对比系统A (高ωn,高ζ), 6, 0.866}, {对比系统B (高ωn,低ζ), 6, 0.25}, {对比系统C (同ωn,低ζ), 3, 0.3}, {对比系统D (高ωn,同ζ), 6, 0.5} }; % 预分配存储性能指标的数组 num_sys length(systems); OS_array zeros(num_sys, 1); Tp_array zeros(num_sys, 1); Ts_array zeros(num_sys, 1); Tr_array zeros(num_sys, 1); sys_handles cell(num_sys, 1); % 存储传递函数对象用于画图 % 循环计算每个系统的指标并创建系统模型 fprintf( 各系统性能指标对比 \n); fprintf(%-25s %-10s %-10s %-10s %-10s\n, 系统名称, OS(%), Tp(s), Ts(s), Tr(s)); fprintf(%-25s %-10s %-10s %-10s %-10s\n, ---------, -----, -----, -----, -----); for i 1:num_sys name systems{i}{1}; wn systems{i}{2}; zeta systems{i}{3}; % 计算理论指标 [OS_percent, Tp, Ts, Tr] calc_2nd_order_params(wn, zeta); OS_array(i) OS_percent; Tp_array(i) Tp; Ts_array(i) Ts; Tr_array(i) Tr; % 创建传递函数 num wn^2; den [1, 2*zeta*wn, wn^2]; sys_handles{i} tf(num, den); % 打印到命令窗口 fprintf(%-25s %-10.2f %-10.3f %-10.3f %-10.3f\n, name, OS_percent, Tp, Ts, Tr); end % 绘制所有系统的阶跃响应对比图 figure(Position, [50, 50, 1200, 500]); % 子图1所有系统响应曲线对比 subplot(1, 2, 1); hold on; grid on; colors lines(num_sys); % 获取一组区分度高的颜色 for i 1:num_sys [y, t] step(sys_handles{i}, 8); % 模拟8秒内的响应 plot(t, y, Color, colors(i, :), LineWidth, 1.5, DisplayName, systems{i}{1}); end xlabel(时间 (s), FontSize, 11); ylabel(响应, FontSize, 11); title(不同参数二阶系统阶跃响应对比, FontSize, 13); legend(Location, best, FontSize, 9); ylim([0, 1.6]); % 统一y轴范围以便对比 % 子图2性能指标雷达图/条形图对比 (此处用条形图更直观) subplot(1, 2, 2); % 由于四个指标量纲和范围不同需要进行归一化以便在同一图中比较 % 我们以“标准系统”的值为基准1其他系统与之比较 norm_OS OS_array / OS_array(1); norm_Tp Tp_array / Tp_array(1); norm_Ts Ts_array / Ts_array(1); norm_Tr Tr_array / Tr_array(1); data_to_plot [norm_OS, norm_Tp, norm_Ts, norm_Tr]; group_labels {systems{:,1}}; bar_handle bar(data_to_plot, grouped); set(gca, XTickLabel, group_labels, XTickLabelRotation, 20, FontSize, 9); ylabel(相对于标准系统的比值 (标准系统1), FontSize, 11); title(性能指标归一化对比 (值越小越好), FontSize, 13); legend({超调量(OS), 峰值时间(Tp), 调节时间(Ts), 上升时间(Tr)}, Location, best, FontSize, 9); grid on; % 在条形图上添加数值标签 for i 1:num_sys for j 1:4 xPos bar_handle(j).XEndPoints(i); yPos bar_handle(j).YEndPoints(i) 0.05; text(xPos, yPos, sprintf(%.2f, data_to_plot(j, i)), ... HorizontalAlignment, center, VerticalAlignment, bottom, FontSize, 8); end end运行这段代码你会得到两张并排的图。左边是五个系统的阶跃响应曲线叠在一起。右边是一个条形图将四个性能指标分别做了归一化处理以标准系统为1这样谁好谁坏一目了然。我们来分析一下结果对比系统A (ωn6, ζ0.866)从曲线看它上升很快而且几乎没有超调平稳地到达稳态。条形图显示它的Tp, Ts, Tr都比标准系统小比值1OS更是小到接近0。这就是“又快又稳”的典范通常对应临界阻尼或过阻尼状态。在一些对超调要求极其严格如精密仪器定位的场合会追求这种参数。对比系统B (ωn6, ζ0.25)曲线表现出剧烈的振荡超调很大。条形图显示它的Tp和Tr非常小响应启动快但OS巨大1Ts也变差了。这就是“快但不稳”。在一些对快速性要求极高、且允许一定振荡的场合如某些开关电源可能会容忍这种参数。对比系统C (ωn3, ζ0.3)和标准系统相比ωn相同但ζ变小了。曲线振荡明显加剧OS增大Ts变长。这说明在自然频率不变的情况下降低阻尼比会牺牲稳定性增加振荡和调节时间。对比系统D (ωn6, ζ0.5)和标准系统相比ζ相同但ωn翻倍了。曲线变得更快Tp, Ts, Tr全面减小而OS保持不变。这说明提高自然频率可以全面提升系统的响应速度且不改变超调特性因为超调只与ζ有关。通过这样的可视化对比参数如何影响性能就变得非常直观。你可以像调音一样通过调整ωn和ζ这两个“旋钮”来塑造出你想要的系统响应特性。5. 进阶探索从二阶系统到高阶系统现实世界中的系统很少是纯粹的二阶的往往有更多的极点和零点。但好消息是很多高阶系统的主导特性可以由一对主导极点通常是一对共轭复极点来近似描述其性能仍然可以用二阶系统的指标来估算。然而非主导极点和零点的存在会实实在在地影响响应。我们用Matlab可以轻松地探究这种影响。假设我们有一个三阶系统传递函数为G(s) 1.05 / ((0.125s1)(0.5s1)(s^2s1))。我们通过添加零点、移动极点位置来观察其阶跃响应的变化。clc; clear; close all; % 定义公共时间轴 t 0:0.01:15; % 系统1: 基础三阶系统无零点 den1 conv(conv([0.125 1], [0.5 1]), [1 1 1]); % conv函数用于多项式乘法 sys1 tf(1.05, den1); sys1.Name 无闭环零点; % 系统2: 添加一个远离虚轴的闭环零点 (s -2.1) num2 conv(1.05, [1/2.1 1]); % 对应 (s2.1)即零点在-2.1 sys2 tf(num2, den1); sys2.Name 远离虚轴的零点(s≈-2.1); % 系统3: 添加一个靠近虚轴的闭环零点 (s -0.2) num3 conv(1.05, [1/0.2 1]); % 对应 (s0.2)零点在-0.2 sys3 tf(num3, den1); sys3.Name 靠近虚轴的零点(s≈-0.2); % 系统4: 在系统2基础上改变一个非主导极点 (将0.125s1变为0.25s1极点从-8移到-4) den4 conv(conv([0.25 1], [0.5 1]), [1 1 1]); sys4 tf(num2, den4); sys4.Name 非主导极点变化(较慢); % 系统5: 零极点对消 (如果分子分母有公因子) % 假设我们设计了一个控制器恰好抵消了系统的一个慢极点(0.5s1) num5 1.05 * 2; % 为了保持稳态增益需要调整分子 den5 conv([0.125 1], [1 1 1]); % 抵消了(0.5s1) sys5 tf(num5, den5); sys5.Name 零极点对消(抵消慢极点); % 收集所有系统 all_sys [sys1, sys2, sys3, sys4, sys5]; % 绘制阶跃响应对比图 figure(Position, [100, 100, 1000, 600]); hold on; grid on; for i 1:length(all_sys) [y, t_plot] step(all_sys(i), t); plot(t_plot, y, LineWidth, 1.5, DisplayName, all_sys(i).Name); end xlabel(时间 (s), FontSize, 12); ylabel(输出, FontSize, 12); title(高阶系统零极点变化对阶跃响应的影响, FontSize, 14); legend(Location, best, FontSize, 10); % 计算并显示各系统的近似二阶等效指标通过阶跃响应数据 fprintf(\n 高阶系统响应特性分析基于仿真数据 \n); for i 1:length(all_sys) [y, t_plot] step(all_sys(i), t); y_final y(end); % 近似稳态值 % 计算实际超调量 [ypk, idx_pk] max(y); OS_actual (ypk - y_final) / y_final * 100; Tp_actual t_plot(idx_pk); % 计算实际调节时间 (2%) y_upper 1.02 * y_final; y_lower 0.98 * y_final; idx_settle find(y y_lower | y y_upper, 1, last); if isempty(idx_settle) Ts_actual 0; else Ts_actual t_plot(idx_settle); end % 计算实际上升时间 (10%-90%) y_10 0.1 * y_final; y_90 0.9 * y_final; idx_10 find(y y_10, 1, first); idx_90 find(y y_90, 1, first); if ~isempty(idx_10) ~isempty(idx_90) Tr_actual t_plot(idx_90) - t_plot(idx_10); else Tr_actual NaN; end fprintf(\n系统: %s\n, all_sys(i).Name); fprintf( 实际超调量: %.2f%%\n, OS_actual); fprintf( 实际峰值时间: %.3f s\n, Tp_actual); fprintf( 实际调节时间: %.3f s\n, Ts_actual); fprintf( 实际上升时间: %.3f s\n, Tr_actual); end运行这段代码你会看到五条形状各异的响应曲线。通过观察和命令行输出的数据我们可以总结出高阶系统中零极点影响的几条实用规律添加闭环零点相当于给系统增加了“超前”特性。远离虚轴的零点如系统2能显著加快系统响应减少上升时间和峰值时间有时还能轻微减小超调使系统更“敏捷”。而靠近虚轴的零点如系统3虽然也能加速但往往会带来更大的超调甚至可能引起振荡因为它更接近主导极点对系统动态影响更剧烈。非主导极点如果一个极点离虚轴比主导极点远5倍以上它的影响通常可以忽略。但如果它不够远如系统4将-8的极点移到-4就会拖慢系统响应增加调节时间让系统变得“迟钝”。零极点对消这是控制器设计中的一个重要技巧。如果系统有一个我们不希望的慢极点导致响应慢我们可以设计一个控制器在相同位置引入一个零点来抵消它如系统5。从曲线可以看出抵消了一个慢极点后系统响应速度明显提升变得更像二阶系统。但要注意理想的零极点对消在现实中很难完美实现因为模型总有误差不完美的对消可能带来问题。这个实验告诉我们面对一个复杂的高阶系统不要慌。先用step函数画出它的阶跃响应然后用我们之前计算二阶指标的方法从响应数据中提取来评估它。再通过分析它的零极点位置Matlab中用pzmap(sys)函数你就能大致判断出是哪个极点或零点在主导系统的“性格”从而知道该从哪里入手去调整或设计控制器。6. 构建你的分析工具箱实用脚本与技巧经过上面的学习你已经掌握了核心方法。最后我分享几个我工作中常用的脚本片段和技巧帮你把这项技能打磨成趁手的工具箱。技巧一批量分析与报告生成当你需要分析一大批不同参数的系统时手动记录效率太低。可以写一个脚本自动计算、绘图并把结果保存到文件里。% 批量分析脚本示例 wn_list [1, 2, 3, 4, 5]; zeta_list [0.2, 0.4, 0.6, 0.8, 1.0]; results cell(length(wn_list)*length(zeta_list), 6); % 预存结果 idx 1; for wn wn_list for zeta zeta_list % 计算指标 [OS, Tp, Ts, Tr] calc_2nd_order_params(wn, zeta); % 创建系统并获取阶跃响应 sys tf(wn^2, [1, 2*zeta*wn, wn^2]); % 存储结果 results{idx, 1} wn; results{idx, 2} zeta; results{idx, 3} OS; results{idx, 4} Tp; results{idx, 5} Ts; results{idx, 6} Tr; idx idx 1; end end % 将结果转换为表格并保存 result_table cell2table(results, VariableNames, ... {自然频率wn, 阻尼比zeta, 超调量OS_%, 峰值时间Tp, 调节时间Ts, 上升时间Tr}); writetable(result_table, 二阶系统参数扫描结果.csv); disp(参数扫描完成结果已保存到 CSV 文件。);技巧二交互式参数调节使用Matlab的inputdlg或 App Designer 可以创建简单的图形界面让你通过滑动条实时调整 ωn 和 ζ并立即看到响应曲线和指标的变化。这对于教学和理解参数影响非常有帮助。这里给一个最简单的命令行交互例子% 简单交互式调节 while true prompt {请输入自然频率 ωn:, 请输入阻尼比 ζ (0ζ1):}; dlgtitle 输入系统参数; dims [1 35]; definput {3, 0.5}; answer inputdlg(prompt, dlgtitle, dims, definput); if isempty(answer) % 用户点了取消 break; end wn str2double(answer{1}); zeta str2double(answer{2}); if zeta 0 || zeta 1 errordlg(阻尼比ζ必须在0和1之间, 输入错误); continue; end % 计算并绘图调用前面章节的函数 [OS, Tp, Ts, Tr] calc_2nd_order_params(wn, zeta); sys tf(wn^2, [1, 2*zeta*wn, wn^2]); figure; step(sys, 10); grid on; title(sprintf(ωn%.2f, ζ%.2f, OS%.1f%%, Tp%.2fs, Ts%.2fs, wn, zeta, OS, Tp, Ts)); end技巧三处理过阻尼和临界阻尼情况我们的公式主要针对欠阻尼系统。当 ζ 1 时系统是过阻尼或临界阻尼的没有超调和峰值时间的概念。在实际代码中需要做判断。function [OS_percent, Tp, Ts, Tr] calc_2nd_order_params_enhanced(wn, zeta) % 增强版处理所有阻尼情况 if zeta 0 error(阻尼比不能为负); elseif zeta 0 % 无阻尼持续振荡 OS_percent 100; % 理论上是100% Tp pi / wn; Ts Inf; % 永远无法进入误差带 Tr (pi - acos(zeta)) / (wn * sqrt(1 - zeta^2)); % 公式仍适用 elseif zeta 1 % 欠阻尼使用标准公式 OS_percent exp(-pi * zeta / sqrt(1 - zeta^2)) * 100; Tp pi / (wn * sqrt(1 - zeta^2)); Ts 4 / (zeta * wn); Tr (pi - acos(zeta)) / (wn * sqrt(1 - zeta^2)); else % 临界阻尼或过阻尼无超调和峰值 OS_percent 0; Tp Inf; % 无峰值 % 对于过阻尼调节时间计算更复杂这里仍用近似公式但结果偏保守 Ts 4 / (zeta * wn); % 上升时间计算也更复杂这里返回NaN或使用其他近似 Tr NaN; warning(系统为过阻尼/临界阻尼峰值时间和上升时间无定义或需特殊计算。); end end把这些代码片段保存好当你需要分析一个新的二阶系统时基本上就是“填空”和“组合”的过程。真正的熟练不是记住所有代码而是理解每个参数和每行代码背后的物理意义。多动手多改变参数多观察曲线的变化你很快就会对二阶系统的“脾气”了如指掌。