ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

无模型自适应控制MFAC仿真复现指南:详解CFDL/PFDL与参数调优

无模型自适应控制MFAC仿真复现指南:详解CFDL/PFDL与参数调优 我从最早的论文复现踩坑开始到后来把六个MFAC仿真案例整理成一套可跑的代码包中间确实花了不少时间。先说结论MFAC这套东西看着名字玄乎实际思路并不复杂核心就是三件事——动态线性化、伪偏导数估计、在线校正控制律。把这三点吃透了SISO、MIMO、CFDL、PFDL这些变体就都是同一套框架下的不同展开。这篇文章我打算从一个复现者的视角把这套仿真程序涉及的CFDL与PFDL差异、伪偏导数的估计与重置、MIMO场景下的矩阵化实现、六组仿真的设计逻辑以及调参经验全部摊开讲。适合两类人看一类是刚接触无模型自适应控制、需要快速跑通仿真做课程设计或毕业论文的学生另一类是想把MFAC用到实际被控对象上、正在评估方案可行性的工程师。前者可以照着步骤复现后者可以重点看参数规律和适用范围。1. 先拆掉“无模型”这个误解再谈仿真设计1.1 无模型不是没有模型而是不依赖系统数学模型很多人第一次听到“无模型自适应控制”第一反应是“这控制器是不是不需要任何被控对象知识”。这个理解不完全对。MFAC不依赖被控对象的精确数学模型但它依赖两个东西系统的输入输出数据以及一种叫做“动态线性化”的实时近似工具。换句话说MFAC是把一个非线性、时变的真实对象在每个工作点附近用一个带时变参数的线性增量模型去近似然后用这个近似模型去设计控制律。这套思路从侯忠生教授的早期工作开始逐步成型在国内工业控制界有相当一批应用案例。之所以在仿真和工程里受到关注是因为大量实际被控对象的机理模型要么建不准要么建成后参数随工况漂移严重要么对象本身强耦合、大时滞用传统PID或者模型预测控制需要花大量时间建模和辨识。MFAC绕开了这个痛点只要有在线数据它就能边运行边更新一个“伪偏导数”从而完成控制。1.2 三类动态线性化的区别就是六个仿真的主线整套仿真程序里最核心的分支是动态线性化的三种格式紧格式CFDL、偏格式PFDL、全格式FFDL。这次程序包里没有做FFDL但CFDL和PFDL分别覆盖了SISO和MIMO场景正好能把主要规律讲清楚。CFDL的基本思想是在当前时刻系统输出增量delta y(k)与当前控制输入增量delta u(k)之间可以用一个时变的标量或者矩阵去描述即delta y(k) phi(k) * delta u(k)这里的phi(k)就是伪偏导数它综合吸收掉了系统非线性、耦合、时滞、参数时变带来的不确定性。CFDL的优点是结构最简单、参数最少、计算量最小缺点是对复杂动态的描述能力有限尤其是系统纯滞后较大、相对阶较高时单靠“当前控制增量”去解释“当前输出增量”会很吃力。PFDL则把历史控制增量也放进来了delta y(k) Phi(k) * [delta u(k), delta u(k-1), ..., delta u(k-L1)]^T也就是说PFDL用过去L步的控制增量共同解释当前输出增量。这个L叫做线性化长度常数。它相当于在CFDL基础上多开了一扇“记忆窗”对时滞系统、非最小相位系统的适应能力明显更强。代价是伪梯度向量或者伪雅可比矩阵的维度从1变成L估计参数的个数增加了对激励信号的要求也更高。就我复现下来的感觉CFDL是入门必写PFDL是工程实用必写二者在参数整定上有截然不同的手感。本文后面会专门用两个仿真实例对比说明。2. 伪偏导数估计与重置机制整套仿真最不能出错的地方2.1 伪偏导数的在线估计算子伪偏导数phi(k)本身是一个未知时变参数MFAC用投影算法对它进行在线估计。以SISO CFDL为例最经典的估计式是phi_hat(k) phi_hat(k-1) eta * delta_u(k-1) / (mu delta_u(k-1)^2) * (delta_y(k) - phi_hat(k-1) * delta_u(k-1))其中eta是估计步长因子mu是避免分母为零的权重因子。这个式子本质上是一个带归一化的最速下降修正括号里的部分是“一步预测误差”即用上一时刻的伪偏导数和上一时刻的实际控制增量去预测当前输出增量预测不准就朝误差减小的方向修正phi_hat。我复现时一个深刻的体会是这个估计式对delta_u(k-1)的绝对值非常敏感。如果控制量出现一个尖峰delta_u(k-1)^2会瞬间变得很大导致修正项被压得很小伪偏导数更新卡住。反过来如果delta_u(k-1)长期趋近于零比如系统进入稳态、控制量不再变化分母又会被mu这个常数兜底但估计会失去激励phi_hat逐渐“僵死”。这就引出了下一条为什么要重置。2.2 重置机制伪偏导数保护与系统稳定性的保险丝伪偏导数的物理意义近似于系统在当前工作点上的“输入输出增益”。对大多数被控对象而言增益是有界的且方向通常不变。因此MFAC在设计时加入重置条件当abs(phi_hat(k))小于等于一个很小的阈值epsilon时直接把phi_hat重置为初值当delta_u(k-1)的绝对值过小无法提供有效激励时重置当phi_hat的符号与初值符号不一致时通常也要重置防止控制方向发生反转。这个“符号检测”极其关键。我遇到的最常见仿真失败场景就是伪偏导数被估计出一个错误的负值而控制系统仍然按照正号方向去生成控制量结果输出一路负反馈发散。加上符号重置之后仿真稳定性立刻大幅改善。在MIMO矩阵版本里重置机制类似只是把标量模值换成矩阵范数、符号换成特征值符号或者主对角元素符号。在实际复现时我建议不要只检查矩阵范数是否小于阈值还要检查伪雅可比矩阵主对角元素的符号是否与初值一致因为MIMO系统的通道增益方向如果翻转比SISO更容易出现发散。2.3 伪偏导数初值怎么选仿真程序里我统一把伪偏导数的初值取在“系统名义增益”附近。SISO系统就取对象静态增益的量级比如对象在零点附近输出对输入的比例约为2初值就设成2左右MIMO系统把伪雅可比矩阵初值设成对角占优、对角元素取各通道名义增益非对角元素给一个较小值比如0.1便于估计算法自己学习耦合关系。这里有一个新手特别容易犯的错为了“无模型”三个字故意把初值设成随机数或者单位阵结果仿真一跑就发散还误以为算法有问题。实际上MFAC的鲁棒性是相对“模型结构未知”而言并不是说任何初值都能稳定收敛。工程上取系统近似增益范围内或者同符号的值才是正确玩法。3. 六个仿真案例的设计逻辑与参数差异3.1 案例总览一条从简单到复杂的进阶路线六组仿真我特意排了一个进阶顺序仿真编号算法格式系统类型核心验证点案例一CFDL-SISO非线性时变对象伪偏导数在线跟踪能力案例二CFDL-MIMO两入两出耦合对象矩阵化MFAC与解耦控制案例三PFDL-SISO带大时滞非线性对象PFDL对时滞的补偿优势案例四PFDL-MIMO两入两出强耦合负载扰动PFDL矩阵化与抗扰动案例五CFDL-MIMO两入两出测量噪声噪声环境下的参数鲁棒性案例六CFDL-SISO工况切换、增益突变对象伪偏导重置与自适应性这个顺序不是我随便排的。前两个案例解决“算法能跑通”的问题中间两个案例解决“复杂对象还能不能控”的问题最后两个解决“实际工程环境下怎么控制”的问题。读者可以按顺序复现也可以遇到对应场景直接跳到对应案例。3.2 SISO与MIMO在实现上的核心差异从代码量来看CFDL-SISO是最小的整个控制器核心循环不到30行。伪偏导数是一个标量控制律是u(k) u(k-1) rho * phi_hat(k) / (lambda phi_hat(k)^2) * (y_d(k1) - y(k))rho是控制步长因子lambda是控制输入权重因子。这里的核心是把phi_hat(k)放进分母当伪偏导数估值很大时自动压缩控制增益避免系统响应过猛这个细节很多初学者会看漏。到了CFDL-MIMO所有标量都变成向量和矩阵伪雅可比矩阵Phi是一个m×m矩阵控制增量从标量变成m维向量控制律变成delta_u(k) rho * Phi_hat(k)^T * (y_d(k1) - y(k)) / (lambda norm(Phi_hat(k),fro)^2)注意分母里的Frobenius范数平方这是对MIMO控制增益的一种自然归一化。同时伪雅可比矩阵的估计式里delta_u变成了列向量修正项变成矩阵外积的形式。我复现时最需要小心的是矩阵维度匹配问题delta_u是m×1估计误差是m×1两者乘积的分母是标量mu delta_u^T * delta_u修正式是误差向量乘控制增量向量的转置得到一个m×m矩阵。方向搞反的话Matlab直接报矩阵乘法维度错误或者更糟糕的是维度恰好匹配但数学意义错了控制效果完全不对。3.3 PFDL仿真的一个关键参数线性化长度LPFDL的核心参数除了rho、lambda、eta、mu之外多了一个线性化长度L。L的意思是用过去L步的控制增量来共同解释当前输出增量。L越大动态线性化模型的历史记忆越长对时滞的容忍能力越强但伪梯度向量的维度越大需要的在线激励信息也越多。案例三我特意用一个包含三拍纯滞后的非线性对象来做对比。同一套对象CFDL和PFDL控制效果差异非常明显CFDL下超调大、振荡明显PFDL(L3)下基本无超调、跟踪平稳。原因是纯滞后系统里当前输出主要受影响于几拍之前的控制动作CFDL只用一个phi(k)去拟合估计值会“乱抓”PFDL把过去三拍的控制增量都放进模型里相当于给估计器递了一个更合理的解释变量集合。这里有一个经验值L一般取系统的纯滞后拍数加1。不知道滞后拍数时从2或者3开始试观察伪梯度的更新曲线是否平稳。L调得过大会出现参数过多、激励不足的问题伪梯度向量来回震荡。4. 实操细节从公式到可运行代码的完整过程4.1 仿真平台与代码框架选择这套仿真我用的MATLAB R2021b控制器逻辑全部用脚本和函数实现不依赖Simulink。这么做有几个原因MFAC的核心是递推控制律和在线参数估计用脚本循环能最直观地看到每个时刻的伪偏导数变化、控制量变化和误差变化用Simulink反而把递推关系藏在模块连线里出了问题难以调试。如果你之后想做半实物仿真再用Simulink封装控制器也不迟那时候核心递推逻辑已经完全验证过了。每个案例的代码我都拆成三个文件plant.m放被控对象mfac_controller.m放控制器核心循环run_simulation.m负责初始化参数、运行仿真、绘制曲线。这样换对象、换算法、改参数都只需要动单一文件复现时非常顺手。4.2 CFDL-SISO核心代码拆解下面是案例一的核心循环代码我加了一些注释方便对照公式看% 初始化 u(1) 0; y(1) 0; phi_hat(1) 2; eta 0.8; mu 1; rho 0.6; lambda 0.5; epsilon 1e-5; for k 1:N % 1. 计算控制增量 error y_d(k1) - y(k); delta_u(k) rho * phi_hat(k) / (lambda phi_hat(k)^2) * error; u(k1) u(k) delta_u(k); % 2. 被控对象输出实际工程中就是传感器测量值 y(k1) plant_Case1(u(k1), y(k), k); % 3. 伪偏导数在线估计 delta_y y(k1) - y(k); phi_hat(k1) phi_hat(k) eta * delta_u(k) / (mu delta_u(k)^2) ... * (delta_y - phi_hat(k) * delta_u(k)); % 4. 重置机制 if abs(phi_hat(k1)) epsilon || abs(delta_u(k)) epsilon ... || sign(phi_hat(k1)) ~ sign(phi_hat(1)) phi_hat(k1) phi_hat(1); end end这段代码的顺序至关重要先用当前伪偏导数生成控制量再让对象产生新输出接着用新输出更新伪偏导数最后做重置判断。如果把伪偏导数更新放在控制量生成之前就相当于用了未来信息在仿真中会得到非常漂亮但不真实的结果拿到实际系统里立刻露馅。这也是我自己最早复现时踩过的坑。案例一中plant人造了一个时变增益对象伪偏导数的真值本身就在缓慢漂移。从仿真曲线可以看到phi_hat能在一个滞后拍内跟上真值变化控制误差稳定收敛这正是MFAC“边估计边控制”能力的直观体现。4.3 CFDL-MIMO核心代码的关键矩阵操作MIMO版本的控制器核心循环在SISO基础上扩展。我直接把案例二中一段关键代码放出来% 伪雅可比矩阵初始化单位阵量级 Phi 1.2 * eye(2); Phi_prev Phi; eta 1.0; mu 1.0; rho 0.8; lambda 1.0; epsilon 1e-5; for k 1:N err y_d(:,k1) - Y(:,k); % 2x1 跟踪误差 delta_u rho * Phi * err / (lambda norm(Phi, fro)^2); % 2x1 控制增量 U(:,k1) U(:,k) delta_u; % 控制量更新 Y(:,k1) plant_Case2(U(:,k1), Y(:,k)); % 对象输出 % 伪雅可比矩阵估计 delta_y Y(:,k1) - Y(:,k); % 2x1 denom mu delta_u * delta_u; % 标量 Phi_new Phi_prev eta * (delta_y - Phi_prev * delta_u) * delta_u / denom; % 重置矩阵范数过小或方向异常时回到初值 if norm(Phi_new, fro) epsilon || ... sign(Phi_new(1,1)) ~ sign(Phi(1,1)) || ... sign(Phi_new(2,2)) ~ sign(Phi(2,2)) Phi_new Phi; end Phi_prev Phi_new; end很多第一次写MIMO版的人会忽略一个大坑伪雅可比矩阵的在线估计对输入激励的“持续激励”要求比SISO高得多。如果系统某个通道的控制量长期不变对应矩阵列的估计会失去修正力。仿真中如果出现某个通道跟踪效果不错、另一个通道响应迟钝的情况先别急着调参数检查一下两个通道的控制量是否都有足够的变化幅度。必要时在两通道参考信号中叠加小幅方波扰动来维持激励。4.4 参数选择的工程经验表六组仿真跑完我把调参规律整理成一张表。这套表在参考资料文档中也有但这里先用白话总结一遍参数作用典型范围调大后的效果调小后的效果rho控制步长0.3~1.0响应快、超调大响应慢、鲁棒性好lambda控制输入权重0.1~10控制动作平缓、跟踪滞后控制动作激进、易振荡eta伪偏导估计步长0.5~2估计收敛快、估值波动大估计平滑、收敛慢mu估计分母权重0.1~5估计抗噪强、动态偏钝估计灵敏、易受噪声干扰epsilon重置阈值1e-5~1e-3重置频繁、可能误重置重置保护失效实际调参顺序我建议固定为先调rho确保系统能稳定跟踪不上蹿下跳再调lambda抑制控制量毛刺最后调eta和mu去改善伪偏导数的平稳性。千万不要一上来就六个参数一起改出了问题根本不知道是谁引起的。5. 复现中踩过的坑与排查思路5.1 一跑就发散问题八成不在控制律而在初值我复现过程中最崩溃的经历是配置好控制器参数后仿真曲线直接冲上无穷大。当时第一反应是控制律写错了反复检查公式三遍没发现问题。后来排查到伪偏导数的初值上我把初值设成了1.5但系统的真实静态增益只有0.2左右伪偏导数一开始就高估了系统增益控制量被放大数倍系统自然爆炸。所以发散时的排查顺序应该是先看伪偏导数曲线有没有巨大跳变再看控制量有没有饱和最后才回到控制律本身。伪偏导数的初值取在对象名义增益附近可以让系统跳过最危险的早期阶段。5.2 伪偏导数频繁重置本质是激励不足或噪声太强案例五加入测量噪声后我观察到一个典型现象伪偏导数在线估值因为噪声干扰上下跳动触发重置条件后跳回初值然后再次被噪声扰动再次重置形成高频重置循环。控制量跟着频繁跳动整个系统看起来并没有真正稳定。解决思路有两个方向第一增大mu让伪偏导数估计的低通滤波效果更强估值曲线更平滑第二增大lambda让控制律对伪偏导数的变化不那么敏感。两个方向可以同时进行通常mu加到1以上、lambda加到2以上就能明显改善。注意重置阈值epsilon不要设太大否则系统会把正常的小估值波动也当成异常引发更多误重置。5.3 MIMO耦合导致某个通道控制失效的处理案例四的PFDL-MIMO仿真里我特意构造了一个强耦合对象u1变化会强烈影响y2u2变化会强烈影响y1。初跑时两个通道的参考信号都是方波结果两条通道都有响应但耦合严重时y1的跟踪曲线出现“牵一发动全身”的拖尾现象。我的处理方法是先把伪雅可比矩阵初值设成对角占优阵对角元素放各通道名义增益非对角元素放接近零的小值让估计算法自己去学习耦合关系然后观察伪雅可比矩阵的非对角元素是否在合理范围内变化。仿真运行一段时间后如果非对角元素能够稳定在一个固定量级说明估计器已经“掌握了”通道间耦合如果非对角元素反复乱跳就要考虑是激励不足可以在参考信号里叠加小幅随机扰动。5.4 从SISO直接抄参数到MIMO为什么经常失效不少读者拿到这套程序后会尝试把案例一的参数直接搬进案例二。我不建议这么干。SISO系统的phi是标量控制律分母是标量平方MIMO系统的Phi是矩阵控制律分母是矩阵Frobenius范数平方两者量级天然不同。同一套eta和rho在SISO下已经收敛到了MIMO下可能因为矩阵范数的作用导致控制量偏小或者偏大。从工程上看MIMO系统的lambda通常要比SISO取得大一些rho要比SISO取得小一些。案例二里我用的是rho0.8、lambda1.0直接在SISO案例里lambda往往只要0.5左右。这个规律并不能精确推导但在我复现过的多个对象上都成立可以作为起步调参的有效参考。6. 从六个仿真延伸出去这套框架还能怎么用写完六个仿真后我最大的感受是这个框架的扩展性极强。CFDL和PFDL只是MFAC中最基础的两个动态线性化形式沿同一套思路还可以往两个方向走。第一个方向是MFAC与预测控制结合叫无模型自适应预测控制。具体做法是在线估计出伪偏导数后不是只做一步前馈而是利用伪偏导数的序列信息做一个多步预测滚动优化控制量。这个方向对时滞系统尤其友好案例三的对象拿过去能直接受益。第二个方向是MFAC与迭代学习控制结合适合重复运行的生产过程比如注塑机、半导体晶圆传输这类周期作业。每个周期结束后用上一周期的误差信息和伪偏导数信息修正本周期的控制轨迹周期维度上的收敛速度会远快于单纯依赖时间维度的自适应。从我自己的实践经验来看MFAC并不是一把万能钥匙它也有一个明确的适用边界系统需要能够用动态线性化去近似伪偏导数需要能够通过在线激励去估计控制系统对瞬态误差要有一定容限。只要满足这些条件哪怕被控对象的机理模型完全未知MFAC也能调出一个可用的控制器。这也是这套仿真程序最值得参考的价值所在。
返回列表