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

资讯详情

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

MFAC无模型自适应控制仿真全解析:从CFDL到MIMO的工程实践

MFAC无模型自适应控制仿真全解析:从CFDL到MIMO的工程实践 做数据驱动控制方向的项目MFAC无模型自适应控制是我绕不开的一类算法。最近我把手上散落的MFAC仿真整理成了一套可复现的程序包包含伪偏导数估计、紧格式动态线性化CFDL、偏格式动态线性化PFDL并且把单入单出系统扩展到了MIMO一共凑了六个仿真案例配套代码和参考资料都整理好了。这篇文章不做理论复读机而是从工程复现的角度把这套程序从原理、代码到调参过程完整拆开给正在入门数据驱动控制、或者做毕设/项目需要MFAC基线算法的朋友做个参考。1. 项目整体设计与六个仿真案例的定位1.1 MFAC为什么值得做一套完整仿真MFAC的核心卖点很直接它不依赖被控对象的数学模型。传统控制里无论是PID、极点配置还是模型预测控制第一步都是先建模哪怕是用系统辨识也要拿到大致的传递函数或状态空间表达式。但很多工程场景里对象本身高度非线性、参数时变、甚至机理不清楚建模的成本远高于控制算法本身。MFAC属于数据驱动控制的典型代表它只利用系统的输入输出数据在线构建一个等价的动态线性化数据模型然后在这个模型上设计控制器。这也带来一个很现实的问题MFAC的理论论文很多公式也漂亮但拿到手想复现一个能跑的仿真往往要踩不少坑。伪偏导数初值怎么设、重置阈值取多少、λ和ρ之间怎么配合这些在论文里通常就一句话“按经验选取”。我这套仿真程序就是为了解决这个“最后一公里”问题把CFDL、PFDL、MIMO三类核心结构做成可以直接运行的案例并且每个案例都配套参考资料方便对照原理解析。1.2 六个案例到底在验证什么所谓“六个MFAC仿真”并不是六种互不相关的算法而是把MFAC的几个关键维度拆开每个维度用一到两个案例做验证。整个程序包的设计逻辑是这样的CFDL是MFAC最基础的形式适合大多数输入输出维数较低、采样周期合适的系统。PFDL是在CFDL基础上增加了对过去多个时刻控制增量的利用适合系统对控制输入的“记忆效应”较强、单步数据模型不够用的情况。MIMO则是把CFDL/PFDL从标量推广到矩阵解决多输入多输出通道之间的耦合问题。案例编号被控对象特征线性化方式验证重点案例1SISO非仿射非线性系统CFDL方波跟踪、伪偏导数在线估计案例2SISO非线性系统且阶数较高PFDL正弦跟踪、动态线性化阶数L的作用案例3SISO时变参数非线性系统CFDL参数突变后的自适应能力案例4SISO受外部扰动非线性系统CFDL抗扰动能力与重置机制案例5MIMO双输入双输出耦合系统CFDL矩阵伪偏导数估计、多通道跟踪案例6MIMO强耦合非线性系统PFDL高阶线性化在MIMO下的效果这样编排的好处是每一个案例解决一个特定问题调试时不会出现“这个地方不对劲但不知道是算法问题还是程序问题”的困惑。我在做这套程序时也是从案例1开始逐步加复杂度最后才碰MIMO这个顺序对新手学习者非常友好。2. 核心算法原理伪偏导数估计与动态线性化2.1 从“数据驱动”说起为什么不需要对象模型MFAC的出发点很朴素对于一个离散时间非线性系统虽然它的真实动态非常复杂但在每一个工作点附近输入输出的增量关系总可以用某种线性形式近似。关键是这个线性的“系数”是时变的而且可以仅凭当前和历史的输入输出数据在线估计。以单入单出系统为例考虑如下一般非线性系统y(k1) f(y(k), y(k-1), ..., u(k), u(k-1), ...)不需要知道f的具体表达式。MFAC的做法是引入“动态线性化”的概念也就是说在k时刻附近系统输入输出的增量关系可以写成Δy(k1) φ_c(k) · Δu(k)其中Δy(k1) y(k1) - y(k)Δu(k) u(k) - u(k-1)φ_c(k)就是伪偏导数。这里的“伪”字很关键它并不是系统真实物理模型的偏导数而是一个能够反映当前工作点输入输出增量关系的等价参数因此被称为伪偏导数。只要Δu(k)不等于零这个φ_c(k)在理论上就一定存在。这也是MFAC能够绕过模型的核心原因。2.2 紧格式动态线性化CFDL与伪偏导数估计CFDL是全称Compact Form Dynamic Linearization的缩写中文一般叫紧格式动态线性化。它只使用当前时刻的控制增量Δu(k)来解释输出的增量Δy(k1)结构最简单所以叫“紧格式”。光有数据模型还不够φ_c(k)是未知的需要在线估计。最经典的方法是带重置的投影算法公式如下φ̂(k) φ̂(k-1) η·Δu(k-1) / (μ Δu(k-1)²) · (Δy(k) - φ̂(k-1)·Δu(k-1))其中η是步长μ是防止分母为零的正数。这个公式本质上就是用上一时刻的预测误差Δy(k) - φ̂(k-1)·Δu(k-1)来修正伪偏导数的估计值。分母中的μ Δu(k-1)²保证修正量有界也是整个算法数值可靠性的基础。伪偏导数估计不能无约束地更新否则遇到不满足“可测条件”的数据段时可能发散所以需要引入重置机制。常见的做法是如果 |φ̂(k)| ≤ ε 或者 |Δu(k-1)| ≤ ε则令 φ̂(k) φ̂(1)这里的ε是一个很小的正数目的是防止伪偏导数退化为零因为一旦φ̂趋近于零控制律的分母也会出现问题控制器输出会变得不可控。重置到初始值φ̂(1)是一种保守但有效的做法。有了φ̂(k)CFDL-MFAC控制律就是u(k) u(k-1) ρ·φ̂(k) / (λ φ̂(k)²) · (y*(k1) - y(k))其中ρ是控制律步长λ是惩罚因子主要用来限制控制量变化幅度。这个控制律有几个很有意思的点它不需要对象模型只用了当前输出和期望输出φ̂(k)出现在分母中但它本身也是估计值所以控制律本质上是一个带有自适应增益的比例控制λ的存在让增益不会过大避免控制量剧烈抖动。2.3 偏格式动态线性化PFDL当单步增量不够用CFDL虽然简单但它的假设是系统在当前时刻的输出增量只取决于当前时刻的控制增量。不少实际系统存在明显的惯性或者相对阶较高u(k-1)的变化要经过多个采样周期才能反映到y(k1)上。这种情况下只靠Δu(k)很难刻画系统动态CFDL的效果会明显打折。PFDL全称Partial Form Dynamic Linearization偏格式动态线性化思路是把过去L个时刻的控制增量都纳入数据模型Δy(k1) φ_{p,L}(k)^T · ΔU_L(k)其中ΔU_L(k) [Δu(k), Δu(k-1), ..., Δu(k-L1)]^Tφ_{p,L}(k)是一个L维列向量被称为伪梯度向量。L是动态线性化的阶数需要人为选取一般取2到5就已经不少了。L的选择本质上是用户对系统“惯性程度”的先验假设L越大模型能描述更长的控制历史影响但需要估计的参数也越多估计误差累积的风险随之上升。PFDL的伪梯度向量估计公式与CFDL类似只是把标量换成了向量φ̂(k) φ̂(k-1) η·ΔU_L(k-1) / (μ ||ΔU_L(k-1)||²) · (Δy(k) - φ̂(k-1)^T·ΔU_L(k-1))对应的控制律为u(k) u(k-1) ρ₁·φ̂₁(k)·(y*(k1) - y(k)) / (λ φ̂₁(k)²) - Σ_{i2}^{L} ρ_i·φ̂_i(k)·Δu(k-i1) / (λ φ̂_i(k)²)注意控制律中的第二项对于历史控制增量前面的系数是负号相当于把过去L个时刻控制变化对未来的影响扣除掉避免控制器“重复发力”。这个细节很容易被忽略但恰恰是PFDL能够比CFDL更平滑地应对大惯性系统的关键。2.4 MIMO系统的矩阵化扩展把MFAC从SISO推广到MIMO核心变化是伪偏导数从标量变成矩阵估计和控制律从代数运算变成矩阵运算。以m输入m输出的方系统为例CFDL数据模型写成ΔY(k1) Φ_c(k)·ΔU(k)其中ΔY(k1)是m维输出增量向量ΔU(k)是m维控制增量向量Φ_c(k)是m×m的伪分块矩阵也叫伪雅可比矩阵。这里的“分块”意味着每个输出增量都可能受到多个控制增量的影响矩阵的非对角元素天然描述了通道间的耦合关系这是MIMO-MFAC能处理耦合系统的理论依据。矩阵版本伪偏导数估计公式Φ̂(k) Φ̂(k-1) η·(ΔY(k) - Φ̂(k-1)·ΔU(k-1))·ΔU(k-1)^T / (μ ||ΔU(k-1)||²)重置条件就要看矩阵的范数如果 ||Φ̂(k)|| ≤ ε 或者 ||ΔU(k-1)|| ≤ ε则令 Φ̂(k) Φ̂(1)MIMO控制律为U(k) U(k-1) ρ·Φ̂(k)^T·(Y*(k1) - Y(k)) / (λ ||Φ̂(k)||²)形式上跟SISO几乎一样但Φ̂(k)^T这个转置很重要它让控制律能把期望输出误差映射回各个输入通道。实际调试中初始伪分块矩阵Φ̂(1)如果取得太离谱MIMO系统的初始响应甚至可能出现控制方向反了的现象这一点在案例5里我会详细说。3. 仿真程序实现从零搭建一套MFAC仿真环境3.1 程序目录与整体结构我推荐的程序目录结构如下适合用MATLAB直接跑也可以改写成PythonMFAC_Simulation/ ├── main_CFDL_SISO.m ├── main_PFDL_SISO.m ├── main_CFDL_MIMO.m ├── main_PFDL_MIMO.m ├── plants/ │ ├── plant_siso_01.m │ ├── plant_siso_02.m │ ├── plant_mimo_01.m │ └── plant_mimo_02.m ├── controllers/ │ ├── mfac_cfdl_controller.m │ ├── mfac_pfdl_controller.m │ └── ppd_estimator.m └── utils/ ├── reset_ppd.m └── mse_metric.m每个主文件对应一类仿真场景案例1到案例6通过切换被控对象和控制器参数来实现而不是在每个案例里复制粘贴一份控制器代码。这样做的好处是后期想改参数或者换对象只需要动主脚本和plant文件控制器部分可以保持稳定。对于学习MFAC的朋友我也建议用这种“对象-控制器-估计器分离”的结构来组织代码调参时思路会清晰很多。3.2 CFDL-SISO主程序代码与逐行说明下面给出案例1的核心代码仿真对象是非仿射非线性系统y(k1) y(k) / (1 y(k)²) u(k)³选择这个对象是因为它在形式上没有显式的控制线性项u(k)以三次方的形式进入系统非线性程度足够强能体现MFAC不需要模型的特点。主程序如下% main_CFDL_SISO.m clear; clc; N 2000; y zeros(N, 1); u zeros(N, 1); yr ones(N, 1) * 1.0; yr(501:1000) 0.5; yr(1001:1500) 2.0; yr(1501:2000) 1.0; % 控制器参数 eta 1.0; mu 1.0; rho 0.6; lambda 1.0; eps_ppd 1e-5; phi0 1.0; phi_hat phi0; phi_record zeros(N, 1); error_record zeros(N, 1); u_prev2 0; for k 1:N-1 delta_u u(max(k,1)) - u_prev2; delta_y y(k) - y(max(k-1,1)); % 伪偏导数估计投影算法 phi_hat phi_hat eta * delta_u / (mu delta_u^2) * (delta_y - phi_hat * delta_u); % 重置机制 if abs(phi_hat) eps_ppd || abs(delta_u) eps_ppd phi_hat phi0; end % CFDL-MFAC控制律 y_ref yr(k1); u_next u(max(k,1)) rho * phi_hat / (lambda phi_hat^2) * (y_ref - y(k)); u(min(k1,N)) u_next; % 被控对象 y(k1) y(k) / (1 y(k)^2) u_next^3; phi_record(k1) phi_hat; error_record(k1) yr(k1) - y(k1); u_prev2 u(max(k,1)); end % 绘图 t 1:N; figure; subplot(3,1,1); plot(t, yr, --, t, y, -); legend(参考信号, 系统输出); title(CFDL-MFAC方波跟踪); subplot(3,1,2); plot(t, u); title(控制量); subplot(3,1,3); plot(t, phi_record); title(伪偏导数估计值);这段代码有几个容易写错的地方我逐个说。第一伪偏导数估计里用到的Δu和Δy必须是上一时刻的控制增量和输出增量对应好的不是当前时刻的。第二重置条件里的|Δu| ≤ ε 不能漏掉否则当系统进入稳态、Δu长期为零时伪偏导数估计会停在原地一旦再遇到参考信号变化控制器响应会明显迟钝。第三被控对象在计算y(k1)时用的是u_next不是u(k)这一点要和数据模型里的Δu(k)严格对应。3.3 伪偏导数重置机制与参数经验伪偏导数重置是MFAC里最容易忽略、但影响最大的环节。很多人第一次跑出来的曲线发散去掉重置机制反而更乱其实就是因为伪偏导数被更新到了不合理的数值区间。我常用的重置写法是单独抽成一个函数function phi_hat reset_ppd(phi_hat, phi0, eps_ppd, delta_u) if abs(phi_hat) eps_ppd || abs(delta_u) eps_ppd phi_hat phi0; end end为什么重置到φ0而不是零因为零会直接让控制律里的φ̂/(λφ̂²)变成0控制器输出陷入死区。重置到初始值相当于告诉算法“我暂时没有把握回到最开始的保守假设”这在工程上是一种比较稳妥的故障保护策略。参数选取方面我整理了一份自己常用的速查表可以应对大多数SISO场景参数作用常用范围备注η伪偏导数估计步长0.1~2过大估计值波动剧烈过小跟踪能力弱μ估计器分母防奇异项0.001~1不要设成0数值上容易出问题ρ控制律步长0.1~1主要影响收敛速度和控制力度λ控制律分母惩罚项0.01~10增大λ可抑制控制量超调但会降低响应速度ε重置阈值1e-5~1e-3系统噪声大时适当调大φ0伪偏导数初始值0.5~2对非线性系统初始值影响早期响应一个比较微妙的地方是λ和ρ的配合如果系统输出出现高频抖动很多人第一反应是减小ρ这没错但如果同时增大λ往往能更快把抖动压下去。因为ρ控制的是“步子迈多大”λ控制的是“步子是不是可以迈出界”两者共同决定了控制量变化幅度。3.4 PFDL与MIMO的代码扩展要点PFDL的代码不是CFDL的简单翻版有几处边界条件需要特别注意。首先是历史控制增量向量ΔU_L的构建在k小于L的阶段历史数据不存在需要对缺省部分补零或者用初始增量填充。我习惯补零因为这样相当于默认系统在启动前处于稳态不会引入虚假的初始扰动。其次是PFDL控制律中第二项的符号。我在最初写PFDL代码时就因为把第二项的负号丢掉了导致系统输出出现明显的周期性振荡查了很久才发现是控制器在后半段“追加”了本应抵消的历史控制量。所以写代码时最好把控制律的每一项单独命名方便定位问题。MIMO代码的扩展则主要围绕矩阵运算。MATLAB里矩阵乘法要注意维度估计公式里(ΔY - Φ̂·ΔU)是m维列向量ΔU^T是m维行向量两者的外积是m×m矩阵对应逐元素的修正量。另外重置条件里的||ΔU||²是对整个控制增量向量的所有元素求和不是只取某个通道的增量否则MIMO系统的耦合通道可能漏掉重置保护。4. 六个仿真案例的详细设计与结果分析4.1 案例1CFDL-SISO方波跟踪案例1的被控对象和代码上一节已经给出。方波参考信号从1变到0.5再变到2这样设置的目的是同时考察系统在幅度变化和方向变化时的跟踪能力。从仿真结果看CFDL-MFAC在前20步就能把输出初步拉到参考值附近随后进入平稳的跟踪状态。伪偏导数估计值在参考信号切换瞬间会出现一个明显的跳变这个过程非常直观当输出误差突然变大时伪偏导数会通过估计公式快速调整从而改变控制器增益。如果把这个过程放大看会发现伪偏导数跳变的方向和参考信号变化方向相反这其实是正常的它反映的是控制器在当前工作点为了产生足够控制量而临时提高增益的行为。4.2 案例2PFDL-SISO正弦跟踪这个案例的被控对象比案例1多了一些“惯性”模型如下y(k1) 0.8·y(k) / (1 y(k)²) u(k) 0.5·u(k-1)注意u(k-1)项的存在说明系统对历史控制量有直接的依赖CFDL会显得力不从心。我分别用CFDL和L2的PFDL跑同一组正弦参考信号对比结果很明显CFDL的输出滞后偏大跟踪误差的峰值大概比PFDL高30%左右。PFDL因为把u(k-1)的贡献也建模进去了控制器能提前“预判”历史控制量的影响滞后明显减小。L的值并不是越大越好我实测L3相比L2的提升已经很小但伪梯度向量需要估计的参数多了一个估计波动反而更大。对于这个被控对象L2已经足以覆盖已知的历史影响再增加L反而带来估计负担。这个经验也提醒我PFDL的L选取不完全是“越大越精确”它和系统的有效阶数是匹配关系。4.3 案例3时变参数系统的CFDL控制实际系统中参数时变很常见我构造了一个在k1000处参数突变的系统y(k1) a(k)·y(k) / (1 y(k)²) u(k)³其中a(k)在前1000步取1之后突变为2。这个突变幅度相当于对象增益翻了倍传统固定增益PID控制器此时需要重新整定而MFAC理论上可以通过伪偏导数的在线估计自适应地补偿。从仿真结果看突变发生后输出出现一个短暂的偏离大约40步后重新回到参考值附近。伪偏导数估计值在突变点附近迅速增大等效于控制器临时提高了对误差的响应力度。这说明MFAC确实对参数突变具备一定的自适应能力。但要注意这种自适应不是无限的如果参数突变幅度过大初始伪偏导数估计来不及跟踪真实的动态线性化参数系统就会进入振荡甚至发散所以重置机制在时变系统中显得格外重要。4.4 案例4受扰系统的鲁棒性验证这个案例我在被控对象的输出端叠加了一组正弦扰动y(k1) y(k)/(1y(k)²) u(k)³ d(k)其中d(k) 0.05·sin(0.2k)。扰动幅度不大但持续存在主要考察MFAC在系统始终偏离理想状态时的表现。实测下来输出会在参考值附近出现与扰动同频率的小幅波动波动幅度和扰动幅度基本在同一量级控制器没有出现发散或者失控。这里有个值得注意的现象伪偏导数估计值在扰动作用下会持续小幅波动这种波动既是对扰动的回应也可能带来控制量的轻微抖动。如果应用场景对控制量的平滑性要求很高可以适当增大λ把控制量的高频成分抑制掉代价是抗扰动的响应速度会变慢。这是一个典型的折中问题代码里通过调整λ就能直观感受到。4.5 案例5MIMO-CFDL双输入双输出解耦控制MIMO案例我选择了一个简单的双输入双输出系统y1(k1) 0.6·y1(k)/(1y1(k)²) 0.3·u1(k) 0.2·u2(k) y2(k1) 0.5·y2(k)/(1y2(k)²) 0.4·u2(k) 0.2·u1(k)可以看到u2(k)会直接影响y1(k1)u1(k)也会影响y2(k1)通道之间存在耦合。MIMO-CFDL的初始伪分块矩阵Φ̂(1)我设为单位矩阵的1.2倍这个初始值在大多数场景下都能正常工作。运行结果显示两个通道都能跟踪各自的参考信号但耦合通道的扰动会导致另一个通道在跟踪过程中出现短暂的过渡波动。比如y1的参考信号从1跳到2y2的输出会在同一时刻出现一个小凹坑随后被控制律修正。这正是MIMO-MFAC与SISO-MFAC最大的区别耦合通过Φ̂的非对角元素被“感知”到并纳入控制律修正。如果初始伪分块矩阵取对角阵不带非对角元素系统的耦合补偿会弱很多。所以当你的MIMO系统耦合明显时我建议初始Φ̂(1)不要用纯单位阵可以给非对角元素也赋一个小值比如0.1这样估计器能从更合理的起点开始搜索耦合关系。4.6 案例6MIMO-PFDL复杂系统跟踪最后一个案例把PFDL和MIMO结合起来被控对象在案例5的基础上增加了历史控制量项y1(k1) 0.6·y1(k)/(1y1(k)²) 0.3·u1(k) 0.2·u2(k) 0.1·u1(k-1) y2(k1) 0.5·y2(k)/(1y2(k)²) 0.4·u2(k) 0.2·u1(k) 0.1·u2(k-1)这种情况下如果还用MIMO-CFDL系统对u(k-1)的历史影响没有显式建模跟踪误差会偏大。改用MIMO-PFDL后伪偏导数矩阵扩展为两个分块矩阵分别对应当前控制增量和上一时刻控制增量控制性能明显改善尤其是在参考信号包含正弦分量时跟踪滞后比CFDL版本更小。不过MIMO-PFDL的参数数量成倍增加调参难度也随之上升。我的经验是先把所有通道的λ、μ、η统一设成SISO场景下的常用值跑通后再针对性能较差的通道微调ρ。贸然给每个通道分别设置不同的λ在初阶段很难判断是参数问题还是耦合问题反而会增加调试成本。5. 参数调节、常见问题与排查经验5.1 最容易翻车的三个参数问题MFAC的调参不像PID那样有成熟的整定规则更多靠对算法结构的理解加反复试错。我把自己调试过程中遇到最多的问题归纳成一张速查表现象可能原因调整方向伪偏导数持续增大或发散η过大、μ过小降低η增大μ检查重置条件控制量剧烈振荡λ过小、ρ过大增大λ适当降低ρ输出跟踪滞后严重ρ过小、φ0偏小增大ρ重置φ0为较大值系统启动阶段冲出边界φ0设置不当减小φ0或者增大λ限制控制量MIMO通道互相干扰明显初始Φ̂矩阵非对角元素缺失给Φ̂(1)非对角元素赋小值如0.1PFDL效果不如CFDLL过大或过小从L2开始试逐步增加对比这里面我最想强调的是η和μ这对组合。η是估计器的学习率μ是分母里的防奇异项两者并不是独立发挥作用的。如果你发现伪偏导数曲线毛刺很多不要只盯着η试着把μ从1改成10观察曲线平滑度的变化。μ增大后估计器对Δu的敏感度降低整体估计会更平滑但代价是估计速度变慢。对噪声较大的系统这往往是比单纯减小η更有效的方案。5.2 伪偏导数发散怎么办伪偏导数发散是MFAC仿真中最常见的“劝退”问题。表现有两种一种是φ̂的绝对值在几个采样周期内暴涨到10^5以上另一种是φ̂在正负大值之间来回跳。遇到这种情况我建议按以下顺序排查第一步确认重置条件是否生效。把代码里|φ̂| ≤ ε 和 |Δu| ≤ ε 的判断打印出来看看是哪个条件被频繁触发。如果重置几乎不触发说明重置阈值ε设置过小或者初始值离合理范围太远。第二步降低η同时增大μ。很多发散是因为估计步长太大单次修正量超过了合理范围。把η从1降到0.2大多数场景下能立刻缓解。第三步检查被控对象代码里是否出现了代数环或者时序错位。我自己就踩过这样的坑在MIMO代码里y(k1)计算时误用了还未更新的u(k1)导致伪偏导数估计输入的数据对不上发散得莫名其妙。如果三步都检查完仍然发散还有一个“暴力但有效”的办法把φ0换成更接近静态增益估计值的数。比如系统在某个工作点输入增加1输出增加大约2那就把φ0设成2让估计器从一个更合理的起点出发。这个方法对非线性系统特别管用。5.3 输出跟踪滞后和振荡的调整方向跟踪滞后和振荡是一对矛盾。滞后说明控制器响应慢一般需要增大ρ或者减小λ振荡说明控制量变化过猛需要减小ρ或者增大λ。我自己的调试习惯是先把ρ固定为0.5λ从0.1开始逐步增大观察输出的振荡幅度和滞后程度找到一个相对平衡的点然后再微调ρ。值得注意的是MFAC的控制律会随着伪偏导数的估计值在线变化所以即使ρ和λ固定系统在跟踪阶跃信号的不同阶段表现也不一样。初期误差大时伪偏导数可能被推得较大控制作用强接近稳态时伪偏导数回落控制作用减弱。这种“自适应变增益”效果是MFAC相对固定增益控制器的优势但也会让调试过程中看到的现象更复杂。不要被前几个采样周期的波动吓到多跑几百步看整体趋势再决定要不要动参数。5.4 MIMO系统的通道耦合与初始矩阵选择MIMO系统的调试和SISO有一个显著区别当出现性能问题时很难判断是某个通道的控制器参数不合理还是通道间的耦合补偿出了问题。我用的一个比较实用的排查技巧是先把参考信号设成完全相同的常值如果两个输出最终都能收敛到各自参考值且误差很小说明控制器的基础能力没问题再去切换差别较大的参考信号测试耦合动态。初始伪分块矩阵的选择对MIMO-MFAC的影响很大。我推荐从Φ̂(1) c·I开始c取1到2之间。如果系统输入输出的物理单位差别很大比如一个通道的量级是0.01另一个通道的量级是1000直接用同样的c会导致两个通道的早期控制效果天差地别。这种情况我建议先把输出数据归一化再统一设初始矩阵否则λ和ρ对两个通道很难兼顾。MIMO-PFDL的情况更复杂每个分块矩阵都需要初始化。我通常让当前控制增量对应的分块矩阵取单位阵的某个倍数历史控制增量对应的分块矩阵取较小的值比如0.05·I。这样相当于先让算法优先考虑当前控制量的作用再逐步学习历史控制量的影响降低了初始阶段的耦合风险。6. 配套资料与进一步阅读6.1 程序包里应该放哪些文件这套仿真程序除了代码还建议配一份简短的说明文档和一份参考资料列表。说明文档里最好写清楚每个案例的数学模型、参考信号以及建议的初始参数这样别人拿到程序后能快速复现而不是对着代码猜参数。我在整理程序时还会把每个案例的典型运行结果截图存进results目录方便对比自己跑出来的曲线是否正常。参考资料的位置也很重要不要放在一个叫“参考资料.txt”的柜子里最好在代码注释里直接标注每个案例对应的理论出处。我自己习惯在文件头部写一行“理论依据侯忠生《无模型自适应控制理论与应用》第3章”这样回头阅读代码时不需要翻笔记就能找到理论支撑。6.2 推荐参考资料MFAC的理论体系主要由侯忠生教授及其团队建立相关书籍和论文是入门的第一选择。我列的这几份资料在我做这套仿真时反复翻阅从易到难排序侯忠生. 无模型自适应控制理论与应用[M]. 科学出版社. 这本书是MFAC最系统的中文专著CFDL、PFDL、MIMO、伪偏导数估计这些概念都有严格推导适合做理论对照。侯忠生, 金尚泰. 无模型自适应控制——几类新型控制方法[M]. 该书覆盖了更多扩展形式包括和迭代学习控制的结合案例扩展时很有参考价值。相关综述论文比如发表在自动化学报、IEEE Transactions on Cybernetics上的MFAC综述重点关注其中关于伪偏导数重置机制和MIMO矩阵估计算法的讨论。我不建议新手上来就啃所有论文而是先把手上的仿真跑通遇到具体问题后再去查对应的理论章节。比如案例2的PFDL跟踪效果不理想时翻书中关于“偏格式动态线性化”的稳定条件分析通常能定位到L选择和历史增量项权重的问题。这套MFAC仿真程序从CFDL到MIMO覆盖了最核心的算法骨架。我实际跑下来最大的感受是MFAC虽然叫“无模型”但使用时对“数据质量”的要求一点也不低伪偏导数估计本质上是拿输入输出数据去拟合一个时变参数模型数据没有激励、采样周期不匹配、参数初始值不合理都会直观地反映在控制性能上。所以做MFAC仿真重心其实不在控制器代码本身而在伪偏导数估计的数值细节和参数配合上。希望这套程序和这篇文章能帮你少踩几个我踩过的坑。
返回列表