
简介资源聚焦自抗扰控制ADRC在迟滞非线性系统中的应用面向自动控制领域的研究人员、工程师及相关专业学生旨在解决压电执行器、智能结构等场景中迟滞带来的控制难题。内容围绕迟滞模型、迟滞非线性、迭代控制、ADRC跟踪及非线性ADRC展开提供基于模型逆和D型迭代学习控制的MATLAB实现代码。两个m文件分别对应模型逆补偿与D型迭代学习策略前者用于补偿系统的非线性特性后者通过迭代更新控制输入提升重复任务下的跟踪精度可直接用于算法仿真与性能对比。资源包为1KB的RAR压缩包共2个文件均为MATLAB脚本现有468人学习下载。对于需要掌握ADRC扩展应用、迟滞非线性补偿或迭代学习控制实现的读者这份代码提供了简洁的参考实现有助于快速理解核心思路并复现实验结果。1. 迟滞非线性与 ADRC 的匹配逻辑压电陶瓷或磁致伸缩执行器在精密定位时输入电压与输出位移之间并不是单值对应同样一个电压点在上升段和下降段会输出两个不同的位移形成迟滞环。这个环的存在让正弦轨迹跟踪出现相位滞后、拐角变圆严重时一个 1 Hz 的往复扫描就能累积几十微米的跟踪误差。普通 PID 把迟滞当作可线性化的高频扰动来处理结果往往是积分项越拉越紧极限环反而更明显。ADRC 的立场则不同它不追求精确描述迟滞环而是把未建模的迟滞项归入总扰动由扩张状态观测器实时估计并在控制量里抵消。把迟滞模型、迭代控制和 ADRC 放在同一个仿真框架中目标就是验证重复轨迹跟踪下误差能被压到接近执行器分辨率。这个组合适合三类人做精密运动平台的工程师、研究智能材料驱动器控制的研究生以及想快速验证非线性控制算法的 MATLAB 用户。下面按实现顺序把每个环节拆开讲。2. ADRC 的 ESO 与非线性反馈迟滞系统的补偿边界2.1 韩京清提出的 ADRC 核心构成韩京清提出的 ADRC 核心构成分三段跟踪微分器TD、扩张状态观测器ESO和非线性状态误差反馈NLSEF外加一个扰动补偿回路。TD 先对参考信号安排过渡过程避免阶跃或快速变化直接把迟滞环的尖锐拐角激励出来ESO 是核心它把系统输出和总扰动分别扩张成不同的状态变量一个估计输出一个估计扰动NLSEF 用非线性函数组合跟踪误差和误差导数最后用 ESO 的扰动估计值 z2 做前馈补偿。对迟滞系统来说ESO 估计出的“总扰动”里包含迟滞非线性、未建模动态和外部负载。这里有一个容易误判的点并非必须使用非线性 ESO 才能处理迟滞。线性 ESO 配上足够的观测器带宽也能把迟滞当作时变扰动估计出来性能差别主要体现在抗噪能力和收敛速度上。ADRC_with_DtypeILC.m和ADRC_with_model_inverse_typeILC.m这两个文件里的反馈层用的基本都是线性 ESO 加扰动补偿区别只在前馈层如何加入迭代学习。2.2 迟滞模型选型与仿真对象仿真中建立迟滞对象常见做法是选 Bouc-Wen 类微分方程模型而不是 Preisach 模型。Preisach 精度高但需要存储二维分布函数离线辨识和实时逆运算都比较重Bouc-Wen 参数少、递推格式简单适合与 ESO 放在同一个定步长循环里做数值仿真。简化的离散 Bouc-Wen 模型可以写成下面的函数function [xh_new, y] boucwen_step(u, du, xh, dt, p) % p [alpha, beta, gamma, n, kx, ku] % alpha 控制迟滞环高度 % beta, gamma 控制环的胖瘦与形状 % n 通常取 1~2n1 时呈饱和型迟滞 dxh p(1)*du - p(2)*abs(du)*abs(xh)^(p(4)-1)*xh ... - p(3)*du*abs(xh)^(p(4)); xh_new xh dt*dxh; y p(5)*xh_new p(6)*u;调用时外部主循环每次传入当前输入增量 du 和上一拍的内部状态 xh。p(5) 是迟滞分量到输出的比例系数p(6) 是输入直通项系数两者共同决定输出幅值。实际整定时先固定 p(6) 让系统在低频段近似线性再用 p(1) 和 p(2) 调节环的宽度。这个模型的不光滑导数会给 ESO 的差分计算带来高频分量所以后面观测器带宽要留有余量。2.3 ESO 离散化与带宽参数线性 ESO 的离散递推非常直接Euler 法就够用。状态 z1 跟踪输出z2 跟踪包含迟滞在内的总扰动function [z1, z2] eso_step(z1, z2, y, u, b0, h, w0) % 线性扩张状态观测器Euler 离散 % w0 观测器带宽决定估计速度与噪声抑制的折中 beta1 2*w0; beta2 w0^2; e z1 - y; % 输出估计误差 z1 z1 h*(z2 - beta1*e b0*u); z2 z2 h*(-beta2*e); end这里 b0 是控制增益估计值是 ADRC 里最敏感的参数。它不要求精确但方向不能错。若 b0 与实际增益偏差超过约 30%ESO 会把一部分已知动态也当作扰动z2 的波形会明显滞后于真实扰动。w0 一般取系统开环穿越频率的 5 到 20 倍采样频率足够高时再往上加一旦 z2 出现高频毛刺说明 w0 已经大到把传感器噪声也估计进去了。参数作用整定建议w0ESO 带宽5~20 倍穿越频率毛刺明显时下调b0控制增益估计阶跃响应辨识偏差控制在 ±30% 内h采样/仿真步长小于最快时间常数的 1/10Bouc-Wen 需要小步长保证数值稳定需要强调ESO 的扰动补偿能力只保证“估计得出来”不保证“补偿得干净”。迟滞环在输入方向反转时斜率发生突变z2 的导数会在反转点附近出现尖峰这会给后面的迭代学习提供错误参考。因此实际工程里ADRC 反馈层负责把系统变成了一个“带残差的积分器型对象”ILC 层再针对残差做批次前馈学习两层职责必须分开。3. 迭代控制叠加D 型 ILC 与模型逆型 ILC 的实现差异3.1 ILC 的适用前提重复批次迭代学习控制ILC不是什么场景都适用它有一个明确前提任务重复、轨迹固定、初始状态一致。迟滞系统恰好符合这个前提因为执行器在每次扫描前都会被复位到同一个机械位置输入电压轨迹相同迟滞环的历史依赖反而变成了一种“可学习的重复性误差”。如果每次开始前迟滞内部状态 xh 没有复位到同一值ILC 学到的前馈会和学习批次错位越学越差。在 MATLAB 主循环里I L C 通常作为外层批次循环ADRC 作为内层实时反馈循环。外层存下来的前馈信号是时间的函数下一轮直接叠加在 ADRC 输出上。D 型和模型逆型两种 ILC 的差别就在于“如何根据上一轮的误差构造修正量”。3.2 D 型 ILC 更新律与 MATLAB 片段D 型 ILC 的更新依据是误差的导数或差分。离散形式写为% D 型迭代学习利用误差差分更新前馈 for t 2:N e_dot (e_k(t) - e_k(t-1)) / h; % 误差变化率 u_ff_next(t) u_ff_k(t) Ld * e_dot; end参数 Ld 是学习增益符号必须与对象方向一致。若第一轮学习后误差 RMS 不降反升多半是 Ld 正负号反了。D 型的优势是不需要对象模型只要知道误差在增大还是减小就够了缺点是误差信号里的高频噪声会被差分放大。通常做法是先把误差序列做一次低通滤波再去计算差分否则几轮迭代后前馈里会充满毛刺。ADRC_with_DtypeILC.m文件的思路就是让 ADRC 保证闭环稳定同时把每轮误差记录下来用 D 型学习率把误差变化趋势折算成前馈修正。因为 D 型对瞬态变化敏感它更适合参考轨迹里带快速加减速的段比如三角波扫描的拐角附近。3.3 模型逆型 ILC 与零相位信号处理模型逆型 ILC 并不直接使用误差的原始时间序列而是先把误差经过一个逆模型整形再作为学习修正量叠加。这里的“逆模型”并不是严格数学意义的迟滞逆而是对线性化主通道的近似逆常见做法是用系统辨识得到的二阶传递函数逆或简化的线性增益。更新结构如下% 模型逆型 ILC误差先整形再学习 e_filt filtfilt(B_f, A_f, e_k); % 零相位低通避免群延迟 u_ff_next u_ff_k Lm * inv_model(e_filt);注意这里我用的是filtfilt不是filter。离线批次数据可以整段处理用filtfilt可以让滤波前后相位延迟为零如果换成filter误差信号会被延迟几十个采样点更新出的前馈和实际轨迹错位迭代根本不会收敛。这是两个实现差异里最容易踩的坑。逆模型的幅值不需要很准ILC 本身会逐步把残余误差压下去但相位对齐必须保证。模型逆型 ILC 的优点是学习量更平滑噪声不会被直接放大缺点是过度依赖辨识精度。若逆模型相位错误或增益显著偏小学习速度会非常慢看起来像停滞在实际误差平台上。3.4 两种 ILC 与 ADRC 的输出叠加方式无论哪种 ILC最终控制量都是 ADRC 反馈量和前馈量的代数和。区别在更新位置上D 型学习的是误差的差分模型逆型学习的是误差经逆模型后的形状两者的物理含义完全不同。对比项D 型 ILC模型逆型 ILC更新依据误差差分逆模型整形后的误差模型依赖基本不需要需要近似逆模型相位敏感性差分本身带半拍延迟低可用零相位滤波噪声敏感度高低适用阶段快变段、拐角处全频段稳态跟踪对应文件ADRC_with_DtypeILC.mADRC_with_model_inverse_typeILC.m实际运行时ADRC 的 z2 已经把包括迟滞在内的慢变扰动抵消了大部分ILC 处理的对象只是残余的、重复性的小误差。因此 ILC 的学习增益通常给得比较保守Ld 和 Lm 从 0.01 到 0.05 起步每轮观察 RMS 变化而不是一步到位。若增益过大前馈会产生振荡这种振荡往往只在第三四轮迭代才暴露出来。4. MATLAB 脚本结构、参数整定与收敛性判断4.1 仿真主循环与批次外循环这两个.m文件的整体结构高度相似外层是迭代学习次数循环内层是单个周期的实时控制循环。外层变量是 u_ff 和 e_k内层变量是状态、ESO 状态和每一时刻的控制量。骨架如下% ADRC ILC 批次循环骨架 for k 1:K_max xh 0; % 每批开始前复位迟滞内部状态 z1 0; z2 0; % 观测器状态归零保持初始条件一致 u_ff_k u_ff; % 当前批的前馈信号 for t 1:T_steps % 计算ADRC反馈量 [z1, z2] eso_step(z1, z2, y(t), u_adrc, b0, h, w0); u0 nlsef(ref(t), y(t), z1); % 简化的非线性反馈 u_adrc (u0 - z2) / b0; % 叠加迭代前馈 u_full u_adrc u_ff_k(t); % 调用带迟滞的对象模型 [xh, y(t)] boucwen_step(u_full, du(t), xh, dt, p); end e_k ref - y; u_ff update_ilc(u_ff, e_k, type); % 选择 D 型或模型逆型 end这段骨架里最关键的是每批开始时把 xh 和 ESO 状态一律清空。迟滞模型的内部状态 xh 记录了输入历史若不清空下一批的迟滞环和上一批不重合ILC 学习的参考轨迹就失真了。ESO 状态清不清空影响相对小但保持初始条件一致总归是安全的工程习惯。4.2 参数整定顺序与优先级多数人拿到脚本会先调学习增益这是顺序上的错误。正确顺序是先把 ADRC 反馈层调稳再开 ILC。先用纯 ADRC 跑一个批次看跟踪误差 RMS 是什么量级这个量级就是 ILC 的起点。如果纯 ADRC 下系统已经振荡ILC 学到的全是振荡模式后面不可能收敛。步骤操作检查指标1固定 w0、b0关闭 ILC阶跃响应无振荡误差 RMS 稳定2从极小 Ld/Lm 起步RMS 随迭代次数单调下降3逐步提高误差滤波截止频率前馈信号是否出现高频毛刺4微调 b0 ±10%RMS 是否进一步下降z2 是否更平滑参数整定里b0 对 ILC 的影响常被忽略。b0 偏差较大时ADRC 反馈回路本身的作用被扭曲残差里的一半是真正的迟滞另一半是控制器自身失配造成的伪误差。ILC 会把伪误差也学进去等下一批迟滞状态变化时这部分前馈反而变成干扰。所以如果 ILC 连续迭代 5 轮以上都停在同一个误差平台先回头调 b0而不是继续加大学习增益。4.3 收敛性判断与发散处理迭代学习的收敛不是看单轮误差而是看相邻两轮误差的变化趋势。常见判断方法是在批次之间做 RMS 比较% 相邻两轮误差 RMS 对比 rms_k sqrt(mean(e_k.^2)); rms_prev sqrt(mean(e_prev.^2)); if rms_k 1.5 * rms_prev % 误差不降反升优先检查学习增益符号和滤波截止频率 warning(ILC 发散减小增益或检查前馈方向); break; end if abs(rms_k - rms_prev) tol % 进入平台期说明当前参数下已到极限 fprintf(误差平台期RMS%.4f\n, rms_k); end1.5 倍这个阈值不是固定标准但作为发散判据很灵敏正常收敛时相邻两轮误差不会大幅反弹一旦反弹说明学习方向错了或增益大了。发散处理顺序是先减半学习增益再看滤波频率是否过高最后检查迟滞内部状态复位是否生效。还有一种隐蔽问题就是参考信号本身的零点偏移和误差序列均值不为零ILC 会把直流偏置慢慢累积进前馈表现为每轮 RMS 都降但最后前馈信号被抬到离谱的幅值。5. 两个 .m 文件对比分析跟踪误差与参数微调技巧5.1 观察两个文件输出差异的三个指标分别运行ADRC_with_DtypeILC.m和ADRC_with_model_inverse_typeILC.m不要只盯着最终误差曲线图重点看三个中间量第一轮误差频段分布、第五轮前馈信号形状、以及 z2 估计扰动在输入方向反转处的尖峰幅值。D 型文件的第一轮误差通常在高频段更突出因为它的学习律本身就会放大误差变化模型逆型文件的前馈则更平滑但收敛速度会慢一到两轮。判断优劣不能脱离轨迹类型。如果参考信号是正弦两个文件最终 RMS 差别不大如果是带快速折返的三角波或梯形轨迹D 型的瞬态修正优势会更明显模型逆型则在稳态段表现更好。实际工程里我会用脚本记录每轮 RMS画成曲线看哪条曲线先进入平台期平台期越低说明前馈与迟滞环匹配越准确。5.2 零相位滤波与初始状态复位技巧最后一个值得固化的技巧是在 ILC 更新前对误差信号做去均值和零相位滤波。直接用filter会引入群延迟这个延迟对反馈闭环可能无感但对迭代学习是致命的因为它会让前馈永远落后参考轨迹几个采样周期改用filtfilt离线滤波后零相位对齐学习内容才反映真实的迟滞形变。滤波截止频率取跟踪信号基频的 5 到 10 倍取太小会削掉拐角信息取太大会把迟滞环转折处的尖峰学进前馈。每批开始时除了把 ESO 状态清零还要把误差序列的均值减掉再进入更新律。迟滞环本身不一定关于零点对称若误差均值不消除D 型学习会把直流偏置一步步累积成前馈的常数项最后抵消掉 ADRC 的积分作用。把第 4 章的收敛判断嵌进主循环在每次更新前先执行 detrend 去掉趋势项再交给 D 型或模型逆型更新律这样两类 ILC 在前几轮的学习效率都能明显提高而且不会在电压边界附近出现前馈饱和。本文还有配套的精品资源点击获取