Matlab系统辨识实战:从阶跃响应提取温控传递函数
发布时间:2026/10/5 1:12:42 锦皓数字建站

干工控和自动化这行的朋友应该都有体会——搞温控系统最头疼的往往不是PID参数怎么整定而是你连对象长什么样都不知道。温度对象天生大惯性、大延迟换热过程还带强非线性你想从机理角度推一个传递函数出来纯属给自己找罪受。热平衡方程列出来换热系数查不到散热面积估算不准最后推出来的模型连自己都不敢信。我这些年做温控相关的项目最常用也最省事的一条路就是直接在对象上做阶跃响应实验然后交给Matlab的系统辨识工具箱去处理从实测数据直接提取传递函数。这个思路不新鲜但真正把它用顺、用明白的人并不多。很多人卡在第一步——实验数据采得乱七八糟后面再怎么辨识也是白搭还有人对系统辨识工具箱的理解停留在GUI界面上点来点去换个场景就不知道怎么用了。这篇文章我就把整套流程掰开揉碎讲清楚从阶跃响应实验设计、数据采集与预处理到用系统辨识工具箱的tfest、iddata这些核心函数完成从数据到传递函数的全流程代码直接给你。不管你用的是R2018b还是R2023b这套流程都跑得通。适合自动化、过程控制方向的在校学生也适合刚入门PID整定、需要快速拿到被控对象模型的工程师朋友。1. 先想明白温控对象为什么适合用辨识建模1.1 机理建模的痛点经历过的人都懂温度控制系统是一个典型的能量平衡过程严格推导的话要从传热微分方程出发[ C \frac{dT(t)}{dt} Q_{in}(t) - \frac{T(t) - T_{amb}}{R_{th}} ]其中(C)是热容(R_{th})是热阻看起来挺简洁但一落到实际工程里就麻烦不断。加热器本身的升降温特性不是线性的散热系数随风速、环境温度变被测对象的温度场分布也不均匀想用一个集中参数模型精确刻画理论和现实之间的差距会让你怀疑人生。我在一个恒温槽项目里吃过亏按机理模型算出来的时间常数是15分钟实际阶跃响应测出来只有4分钟。差在哪保温材料的老化、搅拌不均匀、传感器安装位置的滞后这些在机理模型里根本没法精确体现。从那之后我就学乖了——需要模型直接测别推公式。1.2 系统辨识的本质让数据替你说出模型系统辨识的思路非常简单粗暴你给对象一个已知的输入信号记录对象的输出响应然后通过数学算法在预设的模型结构里找一组参数让模型的输出尽量贴合实测输出。放到温控场景里最常用的输入信号就是阶跃信号因为温度对象响应慢阶跃激励简单可靠一个信号就能把对象的核心动态特性激发出来。用Matlab系统辨识工具箱处理阶跃响应数据本质上是在做这样一件事把输入输出数据封装成iddata对象选择模型结构一阶惯性加延迟、二阶惯性加延迟等用预测误差法或子空间法估计模型参数用仿真对比、残差分析验证模型质量这套流程的优点在于你不需要知道系统内部的具体物理规律只要数据质量过关辨识算法就能帮你找到一组在工程上足够好用的模型参数。对于温度这种大惯性对象一阶惯性加纯延迟模型FOPDT通常已经能覆盖绝大多数控制需求了。1.3 温控对象最经典的模型结构FOPDT在做实验之前有必要先讲清楚我们最终想要的模型长什么样。温控对象最典型、最常用的就是FOPDT结构也就是一阶惯性加纯延迟[ G(s) \frac{K}{\tau s 1}e^{-\theta s} ]三个参数各有明确的物理意义(K)稳态增益输入变化1单位输出最终变化多少。比如加热占空比从50%变到60%稳态温度从45度升到55度那K大约是10度/10%1度/%。(\tau)时间常数系统对输入变化的响应快慢大约等于阶跃响应到达稳态值63.2%所需的时间扣除延迟后。(\theta)纯延迟从输入变化到输出开始变化之间的时间。在温控系统里这个延迟主要来自热量的传递距离和传感器的安装位置。这三个参数一旦拿到后面不管是整定PID用Ziegler-Nichols、Cohen-Coon这类经验公式还是设计更复杂的控制策略都有了可靠的依据。整个系统辨识的流程说白了就是精确估计这三个参数的过程。2. 做实验前先把这些想清楚否则后面全是白干2.1 实验设计是建模成功的一半很多朋友拿到系统辨识工具箱第一反应是赶紧导入数据跑算法。我要泼一盆冷水数据质量决定模型质量实验设计才是整个辨识流程里最关键的环节。垃圾进垃圾出算法再强也救不了坏数据。实验设计要考虑的问题包括阶跃幅度太小响应信号淹没在噪声里太大可能进入加热元件的非线性区比如PWM饱和。工程上一般取额定输入的10%~20%。比如你用固态继电器控制加热棒占空比正常工作在30%~60%那阶跃可以从40%打到55%15%的幅度比较合适。初始稳态确认加阶跃之前系统必须已经达到热平衡输出不再漂移。很多人不重视这一点系统还在升温就开始加激励叠加两个动态过程辨识出的模型必然失真。数据时长至少要覆盖5倍时间常数以上才能看到稳态变化。假设预计时间常数(\tau)约200秒那数据至少记录20分钟以上。我通常的习惯是记录到系统输出达到新的稳态且保持5分钟以上才停止。采样时间要足够密才能捕捉到系统的动态细节。经验法则是采样周期至少要比系统等效时间常数的1/10更小。如果预估(\tau)是200秒采样周期20秒是比较稳妥的下限实际我倾向于用1~5秒的采样周期后期反正可以降采样。注意采样太密不会有什么坏处顶多数据量大一点采样太疏直接丢失动态信息纯滞后和时间常数的辨识误差会急剧增大。宁可多采不要少采。2.2 一个实际的实验流程照着做就行我自己做温控阶跃测试时基本遵循下面的固定流程开启系统让温控对象在初始设定值比如PWM 40%下运行等待温度稳定——怎么算稳定10分钟内温度波动不超过±0.2度。确认一个较低的PID手/自动切换状态。如果设备有PID控制器切换成手动模式固定输出值避免控制器自动调节把阶跃抵消掉。开始记录时间、PWM输出值、温度值记录1分钟基线数据。在某个时间点把PWM输出从40%瞬间切换到55%保持不动。持续记录温度变化直到温度再次达到稳态同样以10分钟漂移小于0.2度为标准。停止记录保存数据。记录环境温度、风速、设备状态等工况信息。这个流程看起来简单但每一环节都有讲究。手动模式的确认特别重要我见过不止一次有人在自动模式下做阶跃测试结果PID回路拼命修正输出你压根没拿到对象的真实响应拿到的是闭环回路对被控对象的响应补偿完全不能用。2.3 数据预处理的几个关键动作实验完成后原始数据一般不能直接丢给辨识算法需要经过几道预处理工序。千万不要嫌麻烦这几步能帮你排除掉大量干扰去除均值/直流偏置如果系统的输入输出不是在零附近变化先把工作点的值减掉让数据围绕零值波动。这不影响动态特性的辨识反而能让算法更稳定。剔除异常值传感器偶尔会蹦出明显跳变的毛刺点要人工检查并处理。我用filloutliers或者直接对局部数据做插值修正。去趋势环境温度缓慢漂移会带来一种低频干扰在数据里看起来像系统还在响应实际是环境在变化。必要时可以先用detrend把趋势项去掉或者在做实验时严格控制环境条件从源头避免。预处理这件事最重要的原则是每一步处理都要心里有数知道自己为什么要这么做。无脑滤波反而会把系统的真实动态信息一起滤掉。3. 核心环节Matlab系统辨识工具箱完整实操3.1 第一步把实验数据导入Matlab并封装成iddata假设你的实验数据存在Excel文件里有两列时间秒和温度度可能还有一列PWM输出。先把它读进来看看长什么样% 读取实验数据 rawData readtable(step_test.xlsx); t_raw rawData.Time; % 时间 u_raw rawData.PWM; % 输入PWM占空比(%) y_raw rawData.Temp; % 输出温度(°C)读进来之后先画个图检查数据形态。我习惯把输入输出画在同一张图上用plotyy或者直接分两个子图观察。figure subplot(2,1,1) plot(t_raw, u_raw, linewidth, 1.5) ylabel(PWM输出 (%)) title(阶跃输入信号) subplot(2,1,2) plot(t_raw, y_raw, linewidth, 1.5) xlabel(时间 (s)) ylabel(温度 (°C)) title(温度响应)如果输入信号在某一时刻从40%突然跳到55%输出温度呈现典型的S形上升曲线先慢、中间快、又变慢这就是标准的锅炉/加热器阶跃响应形态数据可以继续处理。接下来要处理的是采样间隔。实验时如果用的采样时间不均匀需要重采样到等间隔。Matlab的retime函数针对timetable很好用或者直接用interp1做线性插值重采样到固定周期。% 重采样到固定采样周期比如Ts1秒 Ts 1; t_uniform (t_raw(1):Ts:t_raw(end)); u_uniform interp1(t_raw, u_raw, t_uniform, linear); y_uniform interp1(t_raw, y_raw, t_uniform, linear);这里有个细节插值前最好把原始的时间序列做一次排序检查确保时间单调递增。数据采集设备偶尔会丢包导致时间戳回退不检查的话插值结果会出错。然后选取建模用的数据段。从阶跃开始的时间点开始一直到稳态结束去掉基线段和多余的尾部。% 选择阶跃响应有效区间 startIdx find(t_uniform 10000, 1); % 假设阶跃在第10000秒 endIdx find(t_uniform 30000, 1); % 假设记录到第30000秒 t_data t_uniform(startIdx:endIdx); u_data u_uniform(startIdx:endIdx); y_data y_uniform(startIdx:endIdx);接下来是去均值。原因在于我们辨识的动态模型描述的是增量变化关系工作点处的绝对温度没有意义重要的是偏离工作点的相对变化。% 以阶跃前的稳态值作为工作点 u0 mean(u_data(u_data 0.9 * max(u_data))); % 阶跃前的输入均值 y0 y_data(1); % 阶跃前的温度 u_delta u_data - u0; y_delta y_data - y0;最后用iddata封装成系统辨识工具箱的标准数据对象data iddata(y_delta, u_delta, Ts); data.Name 温控系统阶跃响应数据; data.InputName PWM占空比增量; data.OutputName 温度增量; data.InputUnit %; data.OutputUnit °C;到这里数据准备工作基本完成。把这个data对象丢给辨识函数之前我喜欢先用plot(data)再确认一遍数据的形态——注意这里和前面直接plot不一样iddata对象的plot会按照采样周期生成时间轴如果时间范围不合理说明Ts设错了。3.2 第二步用tfest辨识传递函数Matlab系统辨识工具箱里最常用的传递函数辨识函数就是tfest。基本语法是sys tfest(data, np, nz)参数含义dataiddata对象np传递函数分母的阶次极点个数nz传递函数分子的阶次零点个数可以不传或传[]对温控对象最合理的选择是先试一阶模型也就是tfest(data, 1, 0)。一阶模型对应的是(G(s)K/(\tau s1))没有零点。% 辨识一阶模型 sys1 tfest(data, 1, 0); sys1你会在命令行看到类似这样的输出sys1 From input PWM占空比增量 to output 温度增量: 0.9321 G(s) --------------- 187.3 s 1 Continuous-time identified transfer function.这个结果直接告诉我们稳态增益(K0.9321)度/%时间常数(\tau187.3)秒。但注意这个一阶模型没有包含纯延迟。温控系统普遍存在纯延迟直接把纯延迟忽略掉辨识结果对真实系统的拟合度会差很多。怎么处理两种方式第一种用tfest加上延迟阶数iodelay会在后面讲。第二种先做延迟估计再进行一步辨识。我常用的是第二种思路% 估计延迟再辨识带延迟的一阶模型 % 先用delayest大致估计纯延迟时间 theta_est delayest(data); disp([估计的纯延迟时间: , num2str(theta_est), 秒]); % 把延迟信息整合进模型在输入输出数据上平移 data_delay iddata(y_delta, u_delta, Ts); data_delay.OutputData y_delta; % 保持原样 % 使用带延迟的模型结构numerator为0阶denominator为1阶delay未知 sys1_delay tfest(data, 1, 0, NaN);注意上面这个NaN参数的作用——告诉tfest纯延迟未知让算法自动估计。这是很多人不知道的小技巧。tfest的第四个参数可以设定固定或者未知的iodelay传NaN就是让算法自己去找最优延迟。用一个更完整的写法可以仔细对比一下带延迟和不带延迟的模型质量% 系统辨识一阶惯性 纯延迟 sys_fopdt tfest(data, 1, 0, NaN); % 输出模型 sys_fopdt % 提取参数 K sys_fopdt.K; % 稳态增益 Tau sys_fopdt.Tau; % 时间常数 Theta sys_fopdt.OutputDelay; % 纯延迟 fprintf(辨识结果: K%.3f, τ%.2f s, θ%.2f s\n, K, Tau, Theta);输出结果里会多出一个OutputDelay字段单位与数据时间轴一致这里是秒。3.3 第三步模型验证别急着用辨识出来的模型到底行不行不能光看拟合度数字需要从多个角度验证。第一个验证是可视化对比。用compare函数把模型的仿真输出和实测输出画在一起% 模型与实测数据对比 figure compare(data, sys_fopdt)这个图上能看到两条曲线实测输出黑色和模型仿真输出蓝色右上角会显示拟合度百分比比如94.32%。拟合度80%以上说明模型在工程上基本可用90%以上就算相当理想了。温控系统做到90%以上的拟合度并不难前提是数据测得好。第二个验证是残差分析。残差是指用模型预测输出与实测输出的差值理想情况下残差应该是均值为零的白噪声。% 残差分析 figure resid(data, sys_fopdt)残差图如果呈现明显的周期性或趋势性说明模型结构没有完全抓住系统的本质可能需要二阶模型。第三个验证是经验核对。用辨识出的K、τ、θ反推阶跃响应的关键特征和实测数据对比一下实测稳态变化从第10000秒的初始温度到稳态温度的变化量模型稳态变化(K \times \Delta u)这两个数如果相差不大说明模型符合物理实际。如果模型稳态变化比实测大20%以上检查一下数据处理是否出了问题比如阶跃幅度算错了或者工作点选错了。第四个验证是交叉验证。如果你做了两组不同幅度的阶跃实验比如40%→55%和40%→52%用其中一组辨识模型用另一组数据验证模型。这种坏习惯改掉之后你会发现模型的可靠性判断会准确很多。% 假设还有一组验证数据 valData iddata(y_val_delta, u_val_delta, Ts); compare(valData, sys_fopdt)如果两组不同输入幅度下模型都能保持较高的拟合度说明系统在这个区间内近似线性的假设成立模型在更大范围内也有参考价值。如果第二组拟合度骤降说明系统存在不可忽略的非线性模型只在小范围内有效使用时要小心。3.4 如果一阶模型不够用试试二阶有些温控对象惯性分布比较分散比如内外两层结构各自有热容一阶模型拟合度可能只有70%左右。这时应该考虑二阶模型。我通常用两种方式方式一直接让tfest辨识二阶系统% 辨识二阶无延迟模型 sys2 tfest(data, 2, 0); compare(data, sys2)方式二辨识二阶带延迟的模型同时允许分子有一个非零参数来拟合过程特性% 二阶模型分母阶次为2分子阶次为1允许有零点 sys2_advanced tfest(data, 2, 1, NaN); compare(data, sys2_advanced)二阶模型在实践中往往能在一阶模型拟合度不给力时快速把拟合度从75%拉到90%以上。付出的代价是模型复杂了一点不过现在做控制设计时多一两个参数根本不算什么。而且从工程角度二阶加纯延迟的模型完全可以直接用于PID参数整定。注意模型阶次不是越高越好。三阶、四阶模型拟合度可能会再涨一个百分点但参数的可解释性会变差抗扰动能力也会下降。我在实际项目里的原则是二阶够用就不上三阶除非有明确的控制性能需求。3.5 从连续模型到离散模型仿真和控制设计需要tfest默认输出连续时间传递函数这对频域分析、稳态增益计算都方便。但做数字仿真或在Simulink里搭控制系统时往往需要离散时间模型。用c2d转换一下就行% 离散化采样时间Ts_d5秒ZOH保持 Ts_d 5; sys_fopdt_d c2d(sys_fopdt, Ts_d, zoh);离散化后可以直接在Simulink的离散仿真环境里用也可以把差分为差分方程写进微控制器程序。这里有一个老工程师都懂的细节离散化的采样时间要和实际控制器的控制周期保持一致否则仿真结果和现场实现会脱节。4. 常见问题与排查技巧实录用到一定阶段大家遇到的问题其实都差不多。我把这几年被问得最多的几个问题列出来一个个说清楚排查思路。4.1 为什么辨识出来的拟合度就是上不去拟合度一直卡在70%以下最常见的几个原因按检查优先级排序实验数据本身不对。检查阶跃输入是否真的是一个干净的阶跃——如果执行机构比如固态继电器有滞后或者实际PWM输出执行时被控制器干预输入信号就不干净模型区分不了输入与干扰。解决回看输入数据曲线确保它是干净的矩形阶跃。系统没有完全达到稳态。输出还在缓慢爬升就结束了记录算法会把持续爬升当作系统的动态特性导致时间常数估计偏大。解决延长记录时长真正等到温度稳定。工作点选错了。去均值时如果拿错了基准值相当于给模型注入一个人为偏差。解决重新确认阶跃前的稳态值。纯延迟显著但模型结构里没考虑。如果用tfest(data, 1, 0)不带延迟面对一个纯延迟10秒、时间常数180秒的对象拟合度会明显下降。解决换成tfest(data, 1, 0, NaN)。4.2 为什么估算出的时间常数明显不对劲时间常数偏大或偏小典型场景有三种偏大数据记录时长不够系统稳态没跑到算法为了贴合持续上升的趋势把时间常数拉大。对策是记录更长时间注意观察稳态是否真正到来。偏大输入阶跃过程中系统存在积分效应比如热一直在积累没有有效散热严格说对象不是开环稳定的FOPDT模型不适用。这时考虑改用非稳态模型或者加入积分环节。偏小采样时间太粗导致动态细节丢失。对策是提高采样频率或者保证阶跃上升段有足够多的采样点。有一种情况比较隐蔽——传感器安装位置紧挨着加热器测到的温度变化非常快
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。