尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Hammerstein模型辨识实战:MATLAB工具箱设计与应用

Hammerstein模型辨识实战:MATLAB工具箱设计与应用 简介HammersteinToolbox是一套面向MATLAB/Simulink环境的非线性系统建模工具箱主要服务于需要对Hammerstein模型进行辨识、参数优化与仿真的工程师和研究人员。该资源共9个文件包含8个m源码文件和1个txt许可协议文件压缩包仅11KB其中m文件覆盖模型识别、非线性卷积、逆滤波计算等核心函数及完整示例程序结构轻量且便于二次开发。基于Simulink基础工具箱提供从输入输出数据中自动估计静态非线性部分与线性动态部分的算法支持最小二乘、梯度下降等优化策略帮助用户在电力系统控制、声学信号处理等场景下快速搭建并验证非线性模型。借助演示程序和可视化工具读者可以连贯掌握模型识别、参数整定、残差与阶跃响应分析的完整流程从而提升系统建模精度与仿真效率。该资源已有562人学习下载适合正在研究非线性系统辨识或Simulink建模的MATLAB开发者。 这篇博客我会直接从一个实际的建模问题切入全程使用中文按照从业者的口吻来展开不带任何平台痕迹。1. Hammerstein模型为什么值得单独做个工具箱前阵子接了一个pH中和过程的建模需求一开始我直接拿MATLAB里的System Identification Toolbox去跑结果线性模型怎么调都差一口气。后来才意识到问题不是出在算法上而是线性框架本身就表达不了这类系统的核心特征。这类系统最典型的描述方式就是Hammerstein模型——一个静态非线性环节串联一个线性动态环节。而网上现成的MATLAB实现要么太零散要么只覆盖了最简单的辨识场景所以我花了些时间把一套可复用的Hammerstein工具箱整理了出来这篇内容就把它的模型原理、模块设计、辨识流程和踩坑细节一次讲清楚。Hammerstein模型的结构用一句话概括先经过一个无记忆的静态非线性函数再进入一个线性动态系统。数学上可以表达为v(k) f( u(k) ) y(k) G(q) v(k) e(k)其中u(k)是输入v(k)是中间不可测变量G(q)是离散传递函数e(k)是噪声。因为v(k)在物理上通常没有对应的传感器所以不能直接测、只能靠算法去估计这正是该模型辨识困难的根本原因。我可以用一个生活中的类比帮助理解快餐厅的出餐流程是典型的Hammerstein结构。顾客点单输入u后厨房先做一道“翻译”——把订单内容映射为具体的食材和份量静态非线性f然后进入后厨生产线线性动态G最后出餐输出y。中间的食材分配环节v你不会直接写在订单上但它真实存在而且决定了出餐口看到的实际品质。1.1 哪些工程场景能对上号Hammerstein模型的工业场景覆盖比很多人想象中要广。pH中和过程是最经典的代表酸碱滴定曲线本身就是强非线性加上混合搅拌罐的动态特性正好是静态非线性加线性动态的结构。蒸馏塔的塔板温度控制、伺服电机带摩擦负载的运动控制、生物发酵过程的底物消耗和菌体生长也都具备类似特征。实际建模时很多人会在两个极端之间纠结用线性模型结构简单但误差大用神经网络黑箱拟合能力强但缺乏可解释性而且对样本量和训练过程都很敏感。Hammerstein模型处在两者之间——用事先确定的函数结构去描述非线性用传递函数去描述动态特性参数数量少、物理意义明确、泛化能力也有保障。这正是它值得被做成可复用工具箱的原因。1.2 与Wiener模型的区别在块结构非线性模型中Hammerstein模型还有一个经常被混淆的“兄弟”——Wiener模型。两者的区别在于非线性环节的位置Hammerstein是“非线性在前、线性在后”Wiener是“线性在前、非线性在后”。这个顺序不仅仅影响数学表达也直接决定了辨识算法的选择。下表是两者的核心对比对比维度Hammerstein模型Wiener模型结构顺序静态非线性 f → 线性动态 G线性动态 G → 静态非线性 f典型场景执行器非线性阀门、功放传感器非线性测量变送器中间变量含义非线性环节的输出线性环节的输出辨识难度相对成熟过参数化LS需要迭代或特殊输出误差法工具箱覆盖本工具箱主攻可作为后续扩展2. 工具箱的模块划分与调用关系这个工具箱在设计上遵循一个原则让使用者用最少的代码完成“数据准备→模型辨识→结果验证”的闭环。我按功能将其划分为三个模块层次分别对应模型对象层、数据层和算法层。2.1 模型对象层把非线性环节和线性环节绑在一起模型对象是整个工具箱的数据核心。非线性环节和线性环节原本是两块独立的数据结构如果不加封装辨识过程中很容易出现参数错配。我设计了一个结构体HammersteinModel把两者绑定在一个对象里model struct(); model.nl_type poly; % 非线性类型poly,spline,deadzone model.nl_order 3; % 多项式阶数 model.nl_coef []; % 非线性环节系数辨识后填充 model.G_num []; % 线性环节分子系数 model.G_den []; % 线性环节分母系数 model.Ts 0.1; % 采样周期 model.fit_time datetime(now); % 辨识时间戳把模型配置和数据分离在调参时非常方便。你可以在不改变数据的情况下反复修改模型结构参数对比不同配置的辨识效果而不需要复制数据、移动文件等。2.2 数据层激励信号生成才是辨识成败的一半很多人做系统辨识时只关心辨识算法忽略了激励信号设计。实际上输入信号的品质直接决定了参数的可辨识性在Hammerstein模型中尤其明显。工具箱提供了三种默认激励信号PRBS伪随机二进制序列、随机幅值序列、多正弦叠加。我第一次使用工具箱做仿真验证时就用PRBS信号结果非线性环节始终辨识不准后来换成随机幅值序列才解决问题。原因在于PRBS只有两个幅值电平最多激励非线性函数上的两个点中间区域的特性完全没被激活。% 生成激励信号 u1 htSignalGen(prbs, 1000, levels, [-1, 1]); % 两电平PRBS u2 htSignalGen(randamp, 1000, range, [-1, 1], levels, 9); % 9幅值随机序列2.3 辨识算法层三种估计算法各管什么场景辨识算法层是整个工具箱中代码量最大的部分内置了三种估计算法过参数化最小二乘实现简单、计算速度快适用于噪声较小、模型阶次已知的场景原理上先将非线性环节用基函数展开再和线性环节参数合并成回归问题。交替最小二乘迭代法固定非线性参数求线性参数再固定线性参数求非线性参数往复迭代。适用于中等噪声、结构相对简单的场景但收敛性依赖初值。基于优化工具箱的非线性最小二乘通过lsqnonlin同时优化全部参数适用于小规模问题、精度要求高的场景但初始化敏感、计算量最大。实际使用中的选择建议很简单先快速用第一种方法获得一个初值再用第二种方法精修如果精度还不够才动用第三种方法。这三种算法的组合可以覆盖绝大多数Hammerstein辨识需求。3. 跑通一个完整的辨识流程接下来的内容是一个可以直接在MATLAB中复现的完整案例。我构造一个已知的Hammerstein系统用工具箱辨识它随机验证工具箱的辨识效果。这个流程也是普通用户最常用的路径。3.1 第一步生成仿真数据构造一个标准的Hammerstein系统非线性环节为f(u)tanh(2u)线性环节为离散传递函数G(z)0.2z/(z^2-1.5z0.7)采样周期0.1秒。在此基础上叠加高斯白噪声信噪比设为30dB。% 步骤1构建真实系统对象 trueModel htCreateModel(poly, 9, [0, 2, 8/3, 0, 0, 0, 0, 0, 0], [0.2, 0], [1, -1.5, 0.7], 0.1); % 步骤2生成激励信号并仿真 u htSignalGen(randamp, 2000, range, [-1.2, 1.2], levels, 11); [y, v] htsimulate(trueModel, u); % 步骤3叠加测量噪声 rng(2024); y_noisy y 0.02 * randn(size(y));需要特别强调的是这里的非线性环节使用了阶数为9的多项式系数中只有三项非零其余项为0。这样设计是为了验证工具箱能否在允许冗余参数的情况下辨识出真实的稀疏结构——实际工程中我们并不知道非线性函数的真实形式所以工具箱必须有足够的表达容量。3.2 第二步配置模型结构并执行辨识辨识的关键是给算法一个合理的先验配置。我选择了和真实系统相同的线性阶次分母3阶、分子2阶非线性基函数选择多项式且最高阶数设为9。如果对模型结构一无所知可以通过后文第四节的方法进行阶次选择。% 配置待辨识模型结构 config struct(); config.nl_type poly; config.nl_order 9; config.G_num_order 2; config.G_den_order 3; config.Ts 0.1; % 执行辨识 estModel htIdentify(u, y_noisy, config, method, alternating);htIdentify是工具箱的主入口函数内部会根据method参数分派到具体的算法实现。这里选择alternating交替最小二乘迭代法因为它对噪声有中等程度的鲁棒性并且不要求噪声必须是白噪声。3.3 第三步验证结果并判定模型质量辨识结束后必须用独立于辨识数据的验证集来检验模型质量。直观的方法是直接对比真实系统输出和模型预测输出但更定量化的指标是BFRBest Fit Rate最佳拟合率% 用新激励信号生成验证数据 u_val htSignalGen(prbs, 1000, levels, [-1, 1]); y_val_true htsimulate(trueModel, u_val); y_val_model htsimulate(estModel, u_val); % 计算BFR拟合指标 BFR max(0, 1 - norm(y_val_true - y_val_model) / norm(y_val_true - mean(y_val_true))); fprintf(BFR %.2f%%\n, BFR * 100);在一次典型运行中这个流程得到的BFR约为85%到92%。非线性环节估计结果和真实函数tanh(2u)在u的取值范围内几乎重叠只在两端边界处有微小偏差这是多项式在边界处的固有问题不影响整体模型质量。4. 算法实现里的关键细节工具箱中的各个算法模块单独拿出来都不算特别高深但把它们组合成一个稳定、易用的工具箱需要处理很多教科书上没有的工程细节。4.1 过参数化怎么避免数值病态过参数化方法的基本思路是将多项式基函数展开后的各分量分别通过线性动态系统然后再叠加。以多项式非线性为例模型可以写成y(k) a1·G(q)·u(k) a2·G(q)·u²(k) ... an·G(q)·uⁿ(k) e(k)每个基函数的输出被同一个线性子系统滤波而各基函数之间的相关性会导致信息矩阵近似奇异。这正是数值病态的根源。我在工具箱中采用了两种手段来处理一是输入信号预处理。在构造基函数之前先把输入u归一化到[-1,1]区间避免高次项数值过大。二是在最小二乘求解时加入Tikhonov正则化项惩罚过大的参数值。这两种手段组合使用后即使用到9阶多项式也不会出现数值发散。4.2 迭代法收敛控制与初值策略交替最小二乘虽然实现简单但对初值比较敏感容易陷入局部极小值。我的策略是任何一个辨识任务都先用过参数化方法快速得到一个粗糙解用它来初始化迭代法而不是随机生成初值。这个策略大幅提升了收敛到全局最优的概率。迭代过程的停止条件也很关键单纯设定最大迭代次数会导致次优解单纯设定参数变化阈值又可能在早期就过早停止。工具箱采用双条件组合参数变化相对值小于1e-6且连续保持5次迭代才判定收敛。这避免了偶然的震荡造成的误判。4.3 结构参数怎么选阶次与基函数线性部分阶次可以通过经典的AIC/BIC准则在工具箱中自动搜索但非线性部分的阶次选择更微妙——它直接对拟合精度产生影响阶次太低欠拟合阶次太高不仅带来过拟合还会引发数值病态。我的实操建议是不要试图在一次辨识中确定所有参数。先用低阶非线性多项式2到3阶跑通流程看残差的非线性特征如果残差中仍有明显的非线性趋势再逐步提高阶次。交叉验证是判断阶次是否合适的最终标准训练集上拟合度持续上升、验证集上拟合度开始下降这个拐点往往就是合适的阶次。基函数的选择上我的默认推荐是多项式。它实现简单、导数连续、易于解析处理但在动态范围较大的场景中样条基函数比多项式更稳定只是需要额外设置节点位置。工具箱预留了spline选项使用augknt函数生成均匀节点。5. 踩坑记录与排查思路工具箱在反复使用的过程中我积累了一些典型的失败案例记录在这里避免你再走一遍弯路。5.1 激励信号幅值太小非线性环节辨识不出来这个问题的典型现象是辨识结果在训练集上和真实输出几乎重合但把非线性环节单独画出来和真实函数相差很大。第一次遇到时我很困惑因为整体模型拟合度很高为什么会这样检查发现PRBS信号的两电平幅值分别为-1和1非线性函数在[-1,1]范围内确实有输出但对于强非线性函数关键的特征区域往往集中在幅值更大的区间。两电平激励只能激活两个点无法还原中间区域的曲线形状。解决办法是改用多幅值随机序列确保输入信号的电平数覆盖非线性函数的特征区间。信号幅值范围需要覆盖实际工作区间不要贸然超过设备允许范围。5.2 多项式阶数一高就发散多项式阶数高到一定程度后辨识结果开始出现大幅震荡甚至参数值数量级达到10的10次方以上。这是典型的高阶多项式数值病态问题。基函数u、u²、u³等在高阶时数值差异极大导致信息矩阵条件数爆炸。解决方案有两层。第一层是对输入做归一化处理将u缩放到[-1,1]区间这个操作能显著改善条件数。第二层是改用正交多项式基函数工具箱中预留了legendre选项使用勒让德多项式作为基函数在线性最小二乘求解时可显著降低条件数。如果两种方法都用了仍然发散那就是阶次过高应该降低阶次。5.3 模型拟合好但验证集一塌糊涂这是过拟合的典型表现。训练集BFR高达95%但换一批数据之后BFR直接掉到50%以下说明模型记住的是训练数据中的噪声细节而不是系统的真实动态。排查步骤是先检查线性部分阶次是否过高再利用交叉验证绘制“阶次-拟合度”曲线观察训练集和验证集的分叉点。使用工具函数htModelSelection自动完成这个过程更好——它会循环不同阶次组合计算BFR值并输出推荐配置。从经验来看Hammerstein模型的实际应用中线性部分阶次超过5阶、非线性部分超过7阶都属于高风险配置除非有充分的物理依据否则不建议使用。5.4 有色噪声下的有偏估计问题最后再提一个辨识领域的经典问题当噪声是有色噪声而非白噪声时普通最小二乘估计是有偏的。很多使用者忽略了这个前提条件导致参数估计总差一点点。工具箱目前的默认实现假设噪声是白噪声。如果遇到有色噪声场景建议在辨识前先对数据做预白化滤波或者改用辅助变量法。这个扩展也在工具箱的后续计划中——处理Hammerstein模型的辅助变量辨识是把工具箱推向工业级别应用的关键一步。我在实际使用这个工具箱时最大的体会是工具箱最大的价值不在于它的算法有多高明而在于它把“中间变量不可测”这个Hammerstein辨识的核心难点封装干净了。使用者不需要对付数学推导只需要明白“数据质量决定辨识上限算法只是逼近这个上限”这一件事就能把工具用好。后续我打算继续扩展多变量Hammerstein模型的支持以及Hammerstein-Wiener串联结构如果你在实际使用中也碰到了新的坑点欢迎交流我来更新踩坑记录。本文还有配套的精品资源点击获取
返回列表