无模型自适应预测控制与迭代学习控制的仿真对比及调参实战
发布时间:2026/10/13 21:18:28 锦皓数字建站

前一段时间做了个仿真程序对象就是标题里这两个方法MFAPC也就是无模型自适应预测控制还有MFAILC无模型自适应迭代学习控制。折腾下来最大的感受是这两种方法虽然都顶着“无模型”三个字但设计思路、适用场景、调试手感完全不一样放在一起做数值验证比单独跑任何一个都有意思。这篇文章就把我从算法原理、仿真框架搭建到调参踩坑的完整过程整理出来适合正在研究数据驱动控制、或者想用仿真验证MFAC系列方法的小伙伴参考。整个程序本身不复杂但里面有几个“坑”非常隐蔽比如伪偏导数的重置时机、预测时域和学习增益的耦合效应、批次维度上的初值影响这些如果不亲自把曲线画出来光看公式是体会不到的。下面我按自己做实验的顺序从为什么要做这个仿真开始一步步说清楚。1. 这个仿真程序在验证什么从“无模型”三个字说起1.1 为什么还要强调“无模型”基于模型控制器的现实瓶颈传统控制设计里如果要对一个被控对象做预测控制第一步永远是辨识模型不管是传递函数、状态空间还是神经网络模型总归要先建立对系统的数学描述。但在实际工业场景里这个前提经常站不住脚很多过程的机理模型要么复杂到没法解算要么随着工况漂移需要频繁重新辨识更不用说那些本来就说不清的强非线性环节。我在做仿真的时候特意回忆了一个现场场景某条生产线上的温度回路名义上能写出热平衡方程实际运行起来参数却随着物料批次变化拿固定模型做的控制器一换工况就露馅。这时候你就会理解所谓“无模型自适应”并不是说完全不需要任何对象信息而是只利用系统的输入输出数据在线估计一个时变参数我们把这种参数叫做伪偏导数然后把它当作控制设计的关键依据。整个控制器结构里没有被控对象的任何显式数学模型这是本质区别。MFAPC在MFAC的基础上引入了预测机制相当于既保留了数据驱动的自适应能力又把“走一步看一步”变成了“看几步走一步”。而MFAILC则把同样的数据驱动思想迁移到了重复批次过程上比如注塑、机器人关节的重复运动轨迹追踪利用上一次运行的数据修正下一次的控制输入。仿真程序要验证的核心就是在没有模型信息的前提下这两种方法到底能不能稳定、能否跟踪、抗噪声和抗参数扰动能力如何。1.2 MFAPC和MFAILC的定位差异一个面向连续过程一个面向重复批次要是只看名字很容易把这两种算法当成同一种东西的两个版本。实际上它们的应用维度完全不同。MFAPC处理的是时间轴上的连续控制问题每个采样周期都计算一次控制量用过去和当前的输入输出数据在线更新伪偏导数同时用已经得到的伪偏导数信息去预测未来若干步的输出然后滚动优化当前控制量。MFAILC则是在“批次轴”上做文章它面对的是同一条参考轨迹反复执行的场景每个批次都不连续一个批次跑完拿到完整的误差轨迹然后在下一次运行前把所有控制输入整体修正一次。它更接近人的“练习—总结—再练习”过程。所以如果把这两个方法放进同一个仿真程序里它们承担的验证任务是不同的MFAPC重点看它对时变信号和扰动的在线追踪能力MFAILC重点看批次之间的误差收敛速度和最终精度。这两条技术路线恰好互补一起做数值验证就能覆盖比较宽的数据驱动控制场景。1.3 仿真的真正目的不是炫技而是回答三个问题我给自己定的目标很具体不是要复现一篇论文里的所有理论证明而是回答三个工程问题。第一伪偏导数估计在强非线性对象上到底准不准偏差大了以后控制器会不会发散第二预测步长权重和学习增益这些核心参数对系统动态性能的影响有多大、有没有直观的调参顺序第三当对象参数在小范围内缓慢漂移时MFAPC和MFAILC谁更稳这些答案都不能靠推导得出只能把程序跑起来盯着输出曲线一条条看。现在回头看这三个问题几乎全部得到了让我意外的答案。比如伪偏导数的估计值在仿真里根本就不可能收敛到“真值”因为被控对象压根没有严格意义上的真偏导数动态线性化出来的只是一个等价时变参数。但是控制器依然能工作得很好这说明方法依赖的是估计值与实际方向的一致性而不是数值的精确性。这个认知几乎是所有无模型控制仿真调试的前提理解了它后面的参数调整才能有的放矢。2. 两种算法的共同底座动态线性化与伪偏导数估计2.1 紧格式动态线性化用增量关系代替全局模型MFAPC和MFAILC都不是凭空出现的它们共同的理论起点是动态线性化。如果你看过相关论文一定对紧格式动态线性化不陌生对被控的离散非线性系统在满足Lipschitz条件的前提下总存在一个时变标量φ(k)使得系统的增量关系可以写成[ \Delta y(k1) \phi(k) \Delta u(k) ]其中Δy(k1)y(k1)-y(k)Δu(k)u(k)-u(k-1)。这个式子里没有函数f没有机理模型只有一个随工作点变化的等价增益φ(k)。你可以把它理解成虽然系统整体是强非线性的但在相邻两个采样点之间系统的行为可以被局部线性化成一条以φ(k)为斜率的直线。这个斜率不需要全局恒定只需要在每一步足够近似即可。用这个式子反推控制器完全不关心非线性函数长什么样。我选择仿真的被控对象是一个带正弦输入项的非仿射系统假设某种情况下这个系统的解析式里带着sin(u)这些非线性项留给基于线性模型的控制方法去头疼而动态线性化只是把它们全部“吸收”进了φ(k)这正是最吸引人的地方。2.2 PPD在线估计投影算法与重置机制φ(k)是要在线计算的。最开始没有任何先验信息就先给一个初值比如φ(1)0.5。每来一组新的输入输出数据就用投影算法更新一次。MFAC系列论文里最常用的形式是[ \hat{\phi}(k) \hat{\phi}(k-1) \frac{\eta \Delta u(k-1)}{\mu \Delta u(k-1)^2} [\Delta y(k) - \hat{\phi}(k-1)\Delta u(k-1)] ]这个式子看着长逻辑其实很简单方括号里是上一时刻的预测误差如果Δu(k-1)很大就说明当前系统增量对这个输入增量的响应发生了变化估计值就往误差方向偏一偏分母里的μ防止Δu太小时估计值剧烈跳变。η是步长通常取0到2之间μ取一个小的正数。实际仿真中我被重置机制坑过一次。如果Δu(k-1)长时间接近零上面的分母趋近于μ按理说更新量不大但有时候由于输出噪声影响φ估计会一直向一个错误方向漂移最终越积越大控制器输出直接饱和。论文里的方法是在|\hat{φ}(k)|ε或者发生符号突变时把φ重置为初值这个规则看着简单但阈值ε的选择直接影响了仿真结果。我做了几组对照ε太小等于没有重置ε太大会频繁打断正常估计。在我的对象条件下取ε0.01比较合适。2.3 MFAPC的预测机制多步滚动优化而不是单步追赶单步MFAC的控制律本质上是比例跟踪见到误差才动存在天然的滞后。MFAPC的思路是既然已经有φ估计了那就能用递推的方式近似预测未来若干步的输出。设当前时刻为k预测时域为N那么未来第i步的输出可以近似为[ \hat{y}(ki) y(k) \sum_{j1}^{i} \hat{\phi}(kj-1) \Delta u(kj-1) ]不过这里有一个绕不开的问题未来时刻的φ(kj-1)是未知的。简单做法是假设它在预测时域内保持不变等于当前估计值。高级做法是用时间序列模型对φ序列做外推但会增加计算量。我的仿真程序为了测试原理先在控制器里用常数外推然后在另一个版本里加入了简单的一阶外推对比下来差别不算大。这倒说明MFAPC对φ的未来变化不敏感鲁棒性不错。预测目标函数我用了标准的二次型[ J(k) \sum_{i1}^{N} [y^*(ki) - \hat{y}(ki)]^2 \lambda \sum_{i1}^{N} \Delta u(ki-1)^2 ]第一项要求预测输出贴近参考轨迹第二项限制控制输入的变化幅度λ就是控制权重。预测步长N给控制器提供了一定的“前瞻能力”输入权重λ则抑制过激执行二者配合决定了MFAPC的整体动态品质。2.4 MFAILC的迭代机制沿批次轴修正控制输入MFAILC把问题放到批次维度上。第n次运行时控制输入序列是u_n(0), u_n(1), ..., u_n(T-1)。运行结束后我们得到每个采样点的误差e_n(k)y^*(k)-y_n(k)。下一次运行的控制输入按下式修正[ u_{n1}(k) u_n(k) \frac{\rho \hat{\phi}_n(k)}{\lambda |\hat{\phi}_n(k)|^2} e_n(k1) ]这里φ_n(k)依然用动态线性化估计但是是在第n批次内部沿时间轴递推的。ρ是学习增益直接决定每个批次修正的幅度λ同样是权重防止单个点的误差过大导致输入剧烈修正。这个结构与MFAPC最大的区别在于MFAPC每个时刻只向前看几步而MFAILC是在完整跑完一个批次之后用一个标量增益乘上误差统一更新整条控制轨迹。它天然适合具有重复性的工艺过程比如机器人关节走固定轨迹、注塑机循环成型等。仿真中我观察到即使第一个批次的控制输入完全乱来经过几个批次修正后误差也能指数级收敛这是非常直观的迭代学习特征。3. 仿真框架搭建对象、扰动、指标一个都不能少3.1 被控对象选型为什么选非仿射非线性系统仿真程序最容易被忽略但最关键的环节是被控对象的设计。要是选一个线性系统那两种算法都看不出太多名堂跟普通PID没有区别。我要的是那种线性模型完全搞不定的对象才算有说服力。我用的离散被控对象如下[ y(k1)\frac{2.5 y(k)}{1y(k)^2} 1.2 u(k) \sin(u(k)) d(k) ]第一项是状态相关的非线性增益在y接近零时增益最大y很大时增益变小压得很平第二项和第三项构成了对控制输入的非线性映射。d(k)是噪声或扰动项我在仿真里分别做了三种定值扰动、慢变正弦扰动、随机噪声。选这个对象的一个原因是它在文献里是常见的非线性测试对象有代表性又不至于过难导致控制器失效。另一个原因是我希望它包含输入非线性项sin(u)很多工程对象都有执行机构死区、摩擦这类输入相关非线性正好考验数据驱动控制器不依赖模型的能力。3.2 参考轨迹与扰动注入设计参考轨迹我做了两套。第一套是恒定值比如y*1.0用来测试稳态精度和初始阶段的收敛速度。第二套是时变轨迹[ y^*(k) 0.5 0.3 \sin\left(\frac{\pi k}{100}\right) 0.1 \sin\left(\frac{\pi k}{30}\right) ]包含两个频率成分能够观察控制器对不同频段信号的跟随能力。对于MFAPC我用这条轨迹跑了完整2000步对于MFAILC每个批次固定用同一套轨迹但批次长度T设为200步一共跑60个批次这样每个批次恰好覆盖两个周期。扰动注入分三个场景场景A不加扰动作为基准场景B在k500之后加入一个幅度0.05的常数扰动场景C加入方差0.01的随机测量噪声。实际上这次我重点看的是噪声因为无模型控制器的伪偏导数估计对测量噪声的敏感度是绕不开的软肋。3.3 评价指标体系跟踪误差、控制能量和收敛代数评价指标直接决定你能从仿真里“看见”什么。我定义了三组指标第一个是平均绝对跟踪误差[ MAE \frac{1}{K}\sum_{k1}^{K}|y^*(k)-y(k)| ]用于横向对比MFAPC和MFAILC的最终精度。第二个是控制输入的总变动[ \Delta U \sum_{k1}^{K}|u(k)-u(k-1)| ]反映执行机构的平滑程度没这个指标你会被低权重λ带来的“抖动型高精度”骗过去。第三个是MFAILC特有的“批次数阈值”定义为误差首次小于稳态阈值时的批次用来量化收敛速度。在程序里我还特意把每条运行的控制轨迹直接输出成数据表不只看最终误差曲线因为学习控制的收敛过程比结果更能说明问题。某个批次误差虽然小但如果控制输入在中间出现了不自然的跳变那这个结果是要质疑的不是精度好就能糊弄过去。4. MFAPC数值实验预测时域参数与跟踪效果4.1 基准参数下的跟踪曲线解读我先给了一组比较保守的基准参数\rho0.6\lambda0.01\eta1.0\mu1.0预测步长N6控制权重\lambda_u0.5PPD初值0.5。仿真跑2000步对象参数全程不变参考轨迹是恒定值y*1.0。观察输出曲线前50步是最激烈的调整期。因为初始PPD猜测值0.5和真实等价增益差了不少控制输入出现了大约±2的振荡幅度随后迅速收敛50步之后基本稳定在参考值附近稳态误差在0.005以内。这个初始振荡幅度比我预想的要小原因在于MFAPC的滚动优化本身对控制量有限制作用每一步只会基于当前预测做局部修正不会一次性给一个全局冒进的解。如果把它和单步MFAC对比同样是\rho0.6MFAC的初始超调会更大因为单步控制在误差大的时候容易惯性外推过度。整体来看MFAPC在基准参数下表现很稳但也谈不上惊艳。真正有意思的是改动N和\lambda之后系统的性格会发生明显变化。4.2 预测时域N和权重λ怎么配合预测时域N是最能体现“预测”二字的参数。我把N从2改到10其他参数保持不变结果如下表所示预测时域N初始超调(百分比)收敛时间(步)稳态MAE控制输入变动ΔU218.6%380.004112.7412.2%300.003214.267.5%240.002815.8104.9%280.003517.6这里有个很关键的转折点N从2增大到6时超调持续减小收敛变快因为控制器有足够的“前瞻距离”提前行动但N到10以后稳态误差不但没有继续下降反而略微回升了控制能量还变大。原因在于N越大预测模型需要外推的步数越多而外推过程本身有误差等于你在用不准的预测信息做优化自然会削弱最终精度。所以N并不是越大越好最佳值取决于系统的响应时间和PPD外推误差的累积速率。仿真里响应时间大约5步N取6到8之间收益最大。这个规律放之四海而皆准换一个更慢的系统最佳N就会相应变大。λ的作用更像一个阻尼器。我把λ从0.1增大到5直观结果就是控制输入变得更克制输出曲线更平滑但跟踪误差相应增大。具体数值上λ0.1时MAE是0.0012但控制量在参考值附近出现明显的微小颤动λ5时MAE变成0.0101控制曲线平滑得像理想信号。工程中不能只看误差很多时候执行机构的磨损和能耗比那一点精度更重要。实际操作中可以先用大λ跑通再逐步减小观察输出抖动出现后再退回一个台阶这样能找到平衡点。4.3 MFAPC相比单步MFAC的提前量优势为了确认预测机制确实有效我在同一个程序里实现了单步MFAC作为对照。二者都用相同的PPD估计器和重置逻辑唯一区别是MFAC只用当前误差修正MFAPC用N步预测优化。在时变参考轨迹上MFAC的相位滞后大约是3步而MFAPC的滞后只有1步代价是动态过程中控制输入更频繁地变化。相位滞后的差异在高频信号段最明显。我在参考轨迹里加了一个频率较高的正弦分量MFAC在波峰和波谷处都会出现可见的跟踪偏差MFAPC则能保持比较饱满的幅值。这就是预测步长的价值它把未来参考轨迹的信息提前用上了等于控制系统长了一双“前眼”。当然这里说的提前量只对已知参考轨迹有效。如果参考是未来未知的随机信号MFAPC只能用当前和过去信息做零阶外推预测优势会削弱。仿真中这一点很重要因为很多实际工艺的设定值本身就可能是人工在线修改的不是预设轨迹。所以MFAPC最适用的场合至少参考趋势是可知或缓慢时变的这一点在工程选型时要先想清楚。5. MFAILC数值实验批次维度上的收敛规律5.1 初值批次的控制输入变化过程MFAILC程序把时间轴分成了60个批次每个批次200步参考轨迹是固定的时变信号。第一个批次我没有做任何智能控制控制输入直接给零输出完全是被动响应误差自然是全场满江红。从第二个批次开始学习机制接管控制输入。我观察前5批次的控制轨迹变化第二批次的控制输入已经不再是一条直线它开始在参考轨迹变化的位置出现对应形状的起伏虽然幅度和相位都不对但说明误差信息已经成功投影到控制修正量上了。到第5批次控制输入的轮廓几乎和最终形态接近剩下的是振幅收敛问题。到第15批次左右轨迹误差已经降到了稳态水平以下。这个过程的直观价值在于学习控制不是逐步微调某一段而是整条控制轨迹在批次之间同步变形。用工程语言说它更像一个“全局积分器”传统控制是时间轴上逐点积分MFAILC是批次轴上逐点积分。5.2 学习增益ρ对收敛速度的影响控制学习增益ρ是MFAILC最核心的旋钮。我对比了ρ0.2、0.5、0.8、1.4四组。每组都从零输入开始记录误差达到阈值所需的最小批次数结果如表所示学习增益ρ达到稳态所需批次数最终MAE第5批次的输入峰值0.2300.00951.30.5170.00361.90.890.00272.41.460.00254.8ρ增大明显加快初期收敛但代价很直观控制输入峰值从1.3涨到4.8早期批次的执行机构负担非常重。更要命的是ρ1.4时虽然收敛快但在第4和第5批次之间出现了轻微振荡相邻批次误差不单调下降。这在工程上是不能接受的说明学习增益一旦跨过稳定边界控制器会从一个极端摆到另一个极端。安全做法是从ρ0.5起步确认误差单调下降5个批次以上再逐步增大到0.8左右这样既有速度又不至于碰到不稳定边界。λ的调节逻辑与ρ相反。λ增大相当于降低每个点误差对输入修正的信任度收敛变慢但过程更平滑。在仿真中λ0.5和λ2之间的差别主要体现在输入曲线的毛刺数量上。λ越小控制输入越容易在噪声环境下产生尖刺。5.3 参考轨迹改变后重新学习的表现迭代学习控制有一个先天假设每个批次任务完全相同。现实中更常见的情况是任务会在某一批之后被整体改变比如产品规格换线。为了验证MFAILC对这个场景的适应能力我在第30批次把参考轨迹从0.50.3sin改成了0.80.5cos组合。第31批次的反应很激烈因为控制输入还停留在老轨迹修正后的形态输出与新的参考差距很大。不过有意思的是重新学习只需要大约12个批次就能恢复到稳态精度比从零开始的17个批次要快。这说明前30批次积累的控制知识和PPD估计经验没有完全浪费它让后续学习有一个更好的起点至少PPD估计已经比初始猜测值准得多。这给工程应用提了个醒MFAILC换产之后不需要从头调试保留历史学习结果做热启动能明显加快新品上量速度。程序设计上也可以在批次之间保留PPD估计值而不是批次开始时重置成初值除非系统工况发生了本质变化否则都建议沿用上一批次的末值。6. 调试记录调参陷阱、初始化细节与一个意外现象6.1 PPD初值和重置阈值影响为何那么大程序跑通很容易跑出满意的效果难。我在调试过程中踩的第一个坑就是PPD初值。最初以为初值只是一个无关紧要的启动缓存随便设了0.1结果发现MFAPC在初始阶段的控制输入冲到了±5以上跟踪曲线出现了大振幅振荡。原因是初值偏差越大PPD估计器在初期需要修正的量就越大而每次修正都要通过实际施加的输入增量来观察系统响应这就形成了一个不畏缩的探索过程。要抑制这个初始探索的强度除了把PPD初值设得接近系统等价增益限制控制增量的幅值更直接。我在MFAPC里给Δu加了一个限幅环节初始阶段限制在±0.5然后按步数逐渐放开限幅范围。这一招比单纯增大λ效果更自然因为它只约束了探索阶段不影响稳态性能。重置阈值的调试同样费劲。按照论文思路PPD估计值太小就要重置我在噪声环境下经常触发重置导致PPD频繁跳回初值学习效果显著变差。后来改用双重条件只有连续3步|\hat{φ}|ε同时预测误差超过阈值才允许重置。这个逻辑过滤掉了很多由噪声引起的误触碰我的实际经验是噪声环境下重置条件一定要加“连续N步”的门槛否则等于自己给自己制造干扰。6.2 我踩过的三个典型仿真坑第一个坑是PPD估计初始阶段发散。原因是被控对象在y0附近增益很高而初始控制量可能正好让系统跨过这个区域等效增益快速变化单步投影算法的修正方向跟不上。解决方法是把初始控制输入先固定为空载值让系统靠近参考点之后再启动控制器仿真里等于先给50步的“预热”阶段这个处理在工业上称为安全启动。第二个坑是MFAPC在强扰动场景下的积分饱和效应。当系统受到一个长时间的正向扰动时预测优化为了消除误差会不断要求更大的控制增量控制输入趋近饱和值PPD估计量同时被夸大等扰动消失后系统需要很长时间才能恢复。我在控制器里给控制增量做了限幅并且把φ估计器的μ参数从1提高到2这样在控制量接近饱和时降低了PPD更新增益减弱了积分饱和的恶性循环。第三个坑最有隐蔽性MFAILC在第3批次之后误差不降反升甚至出现了一次类似发散的巨大尖峰。排查了很久才发现问题出在批次参考轨迹定义上。我在代码里把参考轨迹序列从0到T-1定义但控制器在计算误差时用的是e(k1)也就是把参考序列左移了一位等于在每个批次里都重复出现一次错位误差补偿。这个错误在单批次仿真里几乎看不出来因为MFAPC是实时滚动优化不会把它当成一个固定错误反复学习但MFAILC会在每个批次里把同一个错误记住并放大。它的收敛快纠错能力强对系统性的偏差也格外敏感。这个教训也说明学习控制程序的参考轨迹对齐问题比普通控制器重要得多必须用单位脉冲响应测试确认每一条数据链路的延时关系。6.3 一个值得留意的耦合现象预测步长与学习增益的关系我在做完两组独立实验后又做了一次联合扫描把MFAPC的N从4调到8同时把MFAILC的ρ从0.4调到0.9直接看它们在同一噪声水平下的误差表现。本以为是两个独立变量结果发现存在明显的耦合预测步长增大之后学习增益的最大允许值反而减小否则高噪声条件下系统更容易进入振荡状态。解释起来也不难预测时域越长控制动作越“激进”因为优化器会为了满足远期轨迹而更大幅度地调整当前输入此时如果MFAILC的学习增益也高两者叠加等于控制能量被双重放大噪声引起的PPD估计误差也就被同时放大。这种耦合效应提醒我参数扫描不能一个一个单独做至少要两两联合看曲面。仿真程序里我把这个联合扫描的脚本保留了下来每次调参都先自动生成一张二维热力图标出误差稳定区域再在稳定区域里选点大大减少了盲目试凑的次数。6.4 如果把这套程序扩展开还能做什么目前的仿真只是把MFAPC和MFAILC各自跑通并做了独立的参数分析。要是后面继续做我会优先往三个方向扩展。一是增加被控对象复杂度把单入单出改成两入两出这样就能测试MFAPC在多变量耦合通道下的表现伪偏导数也要从标量升级成矩阵对应的重置规则和控制系统稳定性会更接近实际多变量过程。二是把MFAPC的预测模型改进为基于历史PPD序列的在线预测网络看看能否进一步提高前馈能力。三是在MFAILC中加入批次间的输入信号滤波用来抑制学习过程对噪声的过度拟合这对于真实系统尤其重要因为我见过太多仿真数据好看、一上设备就抖得不能看的案例。另外一个我很想做的扩展是参数不确定性测试把被控对象的2.5这个系数在每个批次或每隔若干步随机扰动20%看看两种算法的鲁棒性差距。这种测试在仿真里成本极低但对工程判断非常有价值因为它能告诉你一套控制器参数到底能覆盖多大的工况范围。整套程序的核心文件并不长无非是一个PPD估计函数、一个控制律求块、一个对象模型函数再加一个主循环脚本。但真正有价值的不是代码量而是你从仿真曲线里读出的那些规律预测时域不是越大越好学习增益必须和预测能力联合标定伪偏导数估计算不准没关系方向对就行。这些经验光看公式是看不出来的。我自己从这套仿真里收获最大的就是终于把“无模型”三个字从概念变成了手上的曲线它不是说你可以完全不了解对象而是说你可以用一种完全不同的在线数据机制去替代传统建模这个负担。希望这篇记录能帮你少走几个我走过的弯路。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。