2. 从精确建模的疲惫,到不依赖模型的MFAC思路
2.1 传统自适应控制的现实瓶颈
接触过控制工程的人差不多都有过这种体验:理论课上推导了一大堆自适应律,看起来非常精致,但拿到现场设备上,控制器往往坚持不了几个班次就不对劲了。原因其实不复杂,传统自适应控制,包括自校正控制和模型参考自适应控制,都需要先对被控对象建立一个结构已知、参数可在线辨识的数学模型。一旦对象结构本身就不清楚,或者强非线性,或者工况在持续漂移,辨识出来的参数很容易失真,控制效果自然就跟着崩。
我之前负责过一个液位控制的小项目,对象本来用一阶惯性加纯滞后模型建模,但实际系统里面有明显的摩擦非线性,还有一段很难精确刻画的加热滞后。为了凑模型参数,光阶跃响应就做了好几组,可是换一个工作点,参数又变了。最难受的是模型参考自适应里面那个参考模型,如果我连对象真实动态都不清楚,怎么选参考模型都会显得很一厢情愿。这种“建模难、建模贵、模型还不一定靠得住”的问题,在工程现场其实非常普遍。
MFAC也就是无模型自适应控制,恰恰是冲着这个痛点去的。它不要求你先给出系统的结构模型,不要求你对非线性项做近似,也不需要做系统辨识。整条设计路线建立在被控对象的实时输入输出数据上,直接在受控系统的工作点附近构建一个等价的动态线性化模型,然后基于这个等价模型去设计控制器。理解这一点之后,再回头看“无模型”三个字,心里就踏实多了。这里的“无模型”指的是不需要建立受控对象的结构化数学模型,并不意味着完全没有控制模型,它使用的是一种在线更新的等价数据模型。
2.2 MFAC的基本设定:受控对象的I/O数据就能用
MFAC之所以能摆脱精确建模,本质上靠的是一种很强的工程直觉:一个系统不管内部物理过程多复杂,只要它的输入输出是可测的,而且输出随输入的变化在宏观上是平滑、有界的,那么在当前工作点附近,系统的行为总能用一个小范围的线性关系去近似。这个近似不需要描述系统的全局动态,只需要描述“此刻如果我把控制输入改变一个量,输出大概会变多少”就够了。
这里面最关键的两个数,一个是在线估计出来的特征参数,通常叫伪偏导数或伪梯度,另一个是控制输入端到输出端的增量关系。伪偏导数不代表系统某个物理参数的估计,它更像是一个随工作点变化的时变增益,把系统从“输入增量”到“输出增量”的传导关系给浓缩了。因为系统本身是非线性的,伪偏导数必须在线更新,以保证每时每刻的线性化模型都有足够好的预测效果。
在这个设定下,被控对象被视作一个仅通过I/O数据对外呈现的系统:
y(k+1) = f(y(k), ..., y(k-na), u(k), ..., u(k-nb))
其中 f 是完全未知的非线性函数。传统做法会去辨识 f 的长相,MFAC不这么做。它只在当前 k 时刻,用输入增量 Δu(k) 和输出增量 Δy(k+1) 之间建立一个局部线性化等价模型,例如:
Δy(k+1) = φ(k) Δu(k)
有了这个式子,系统就被“降维”成了每一拍都在更新的变增益线性系统。后面设计控制器只需要围绕这个一阶等价模型展开,复杂度立刻降下来了。注意,这个等价模型几乎每一刻都在变,因为它要跟着原非线性系统的工作点走。伪偏导数 φ(k) 的在线估计质量,直接决定整个MFAC控制器的成败,这也是为什么后面仿真里真正需要花时间琢磨的往往是估计器那一块。
2.3 动态线性化在最底层改变了什么
过去我们处理非线性系统,最常用的两条路,要么在某个固定工作点附近做泰勒展开,得到一个线性模型,然后在这个模型上设计控制器,也就是经典的线性化方法;要么引入反馈线性化或者精确线性化,通过坐标变换和非线性反馈把系统化成线性系统。这两条路都要求我们对对象的非线性结构有足够准确的了解。工程现场难就难在,即使能测到数据,也很难把数据背后的机理结构还原出来。
动态线性化和这些方法的本质区别在于,它不在系统内部寻找真实结构,而是直接在“输入增量空间”上构造等价关系。
这个想法可以打一个比方。你开一辆从没拆开过的车,不需要知道发动机缸数、喷油脉宽和变速箱齿比,只需要知道踩油门之后车速变化了多少、方向盘打过去之后横摆角速度变化了多少,就能开着它上路。控制器的职责不是修发动机,而是“根据当前车速和期望车速,决定下一脚油门踩多重”。踩多少油门的经验,来自于上一脚油门引起的车速变化。如果路面变陡了,这一脚同样深度引起的速度增益变小,只要控制算法能实时把这个增益重新估计出来,司机就不会感到车辆失控。动态线性化干的就是这件事:在线估计“当前路况下的油门增益”。
把这个机制落到控制算法设计上,最深层的改变是,控制器不再依赖“离线完成的建模”,而是把“建模”和“控制”打包在一个在线闭环里完成。建模不再追求精致的全局解释力,只追求局部够用、更新够快。这在控制理论内部是一次逻辑重构,相当于把主导权从“机理分析”转移到了“数据反馈”上。
2.4 为什么这种思路没有更早流行
不少入门者看到MFAC,第一个感觉是它很简单,第二感觉是它太“不讲道理”了。为什么这样一个不依赖模型、算法结构又清晰的方法,没有更早成为主流?实际上这和理论完善度、计算条件都有关系。
早期做自适应控制的人不是不知道模型难建,而是那时对“用一个时变参数去吸收非线性动态”这件事缺乏系统性理论支撑。MFAC的完整框架是逐步建立起来的,包括伪偏导存在性的理论前提、估计算法收敛性分析、闭环稳定性证明,这些工作做了很多年才形成相对完备的体系,让后来者能够放心使用。与此同时,早期工业控制器计算能力有限,每一拍都要完成伪偏导估计和控制律计算的要求并不总是能被满足。现在嵌入式控制器的算力上来了,这类算法的部署门槛才真正降了下来。
所以在我个人看来,MFAC最大的贡献不是给出一个更聪明的控制器,而是重新界定了一个问题:把未知非线性系统用数据驱动的方式在线线性化,然后把自适应控制设计建立在这个在线等价模型上。你一旦接受这个思路,就会发现它可以很方便地推广到纯时滞系统、多输入多输出系统,甚至一些结构未知的复杂工业过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
3. 紧格式、偏格式、全格式:动态线性化到底有几种玩法
3.1 紧格式动态线性化:最小化版本的等价模型
上一节只给出了动态线性化最基本的形式,也就是紧格式动态线性化。这里的“紧”指的是用一个标量伪偏导数,把从控制输入增量到输出增量的一步映射关系给表示出来,公式写出来就是:
Δy(k+1) = φ(k) Δu(k)
这个式子简洁到让人甚至怀疑它是不是偷工减料。一次非线性系统的变化,怎么可能只由一个时变标量就能刻画?这里有一个重要的理论前提,系统输出对输入的“增益方向”不能随意改变,在数学上通常表示为 φ(k) 的符号保持不变且非零。工程语言就是,被控对象的静态增益方向不能乱跳。比如对阀门开度增大导致流量增大的系统,φ(k)>0;如果阀门装反了,一直是负作用方向,则 φ(k)<0。符号不能时正时负,否则控制器会无所适从。
紧格式模型最大的优点就是参数少,只有一个伪偏导数需要在线估计,计算开销极小。缺点也同样明显,它要求系统的时滞不能太大,或者更准确地说,当前控制输入的变化要能在下一步输出里看到明显响应。如果被控对象存在显著的大纯滞后,紧格式会努力用伪偏导数去“吸收”滞后带来的影响,但结果往往是控制律计算需要的预测信息和实际响应之间错位,调节品质迅速恶化。
所以紧格式适用于相对阶低、滞后小的对象,也适合作为学习MFAC的第一个仿真模板。它能用最少的代码量让你看清动态线性化和自适应控制是如何结合在一起的。
3.2 偏格式动态线性化:把滞后信息纳入输入滑动窗口
遇到大时滞、高相对阶系统的工程师,通常会把紧格式升级成偏格式。偏格式不再只考虑当前一拍的控制增量,而是引入一个固定长度 L 的输入增量滑动窗口:
Δy(k+1) = Φ(k)^T ΔU_L(k)
其中 ΔU_L(k) = [Δu(k), Δu(k-1), ..., Δu(k-L+1)]^T,Φ(k) 是一个列向量,每个分量都对应不同历史时刻输入增量对当前输出增量的影响强度。
之所以叫“偏”,是因为它只用了输入侧的历史信息,没有把输出侧的历史信息放进线性化模型。这样做的好处是把纯滞后和多步动态特性通过输入窗口表示出来。比如过程纯滞后大约5拍,如果窗口长度L取到6左右,控制律计算时就能看到前几步输入变化对未来输出的影响,环节之间的相位错位问题会缓解很多。
代价当然也有。窗口长度每增加一,需要在线估计的参数就多一个。原来紧格式是单参数估计,偏格式变成了L参数估计,参数数量增加之后,估计器对噪声的敏感度会变高,参数之间的耦合也会让调参变得更加微妙。一个常见的经验是,L不要盲目取太大,一般取到“系统纯滞后拍数加系统相对阶再加1”这个量级附近就已经够用。取太大的窗口,不仅计算量上不划算,在线辨识的长期稳定性也会下降。
3.3 全格式动态线性化:输入输出数据都进窗口
既然输入历史信息有作用,那输出历史信息是不是也应该考虑?全格式动态线性化就是这么做的,它把输入增量和输出增量同时纳入一个更宽的数据向量:
Δy(k+1) = Φ(k)^T ΔH_L(k)
ΔH_L(k) 里既有 Δu(k) 到 Δu(k-Lu+1) 的输入增量,也有 Δy(k) 到 Δy(k-Ly+1) 的输出增量,形式更加一般。这样构造的等价线性模型可以刻画更复杂的系统内部反馈特性,尤其是对象本身带有明显内部自平衡动力学的时候,输出历史信息对预测未来输出很有帮助。
从理论上看,全格式是覆盖范围最广的,但工程上是否一定要用全格式,要算一笔账。全格式的参数数量是 Lu 加 Ly 之和,比偏格式多出一截,在线估计需要的激励水平也更高。如果系统运行期间控制信号长期平稳,没有足够丰富的动态激励,参数向量可能根本辨识不出来。因此,全格式比较适合系统动态复杂、数据丰富度足够的场景,而多数SISO过程的MFAC设计,偏格式通常已经能满足需求了。
对做仿真和初步工程验证的人来说,我建议先吃透紧格式,再把紧格式改造成偏格式,最后再考虑全格式。这不只是一个由易到难的学习路径,更像是一个由单一增益到多参数在线估计的认知升级过程。你会逐渐理解,为什么MFAC论文里总是一大段一大段地在证明伪偏导的有界性和估计器的收敛性,因为这些保证恰恰是工程可靠性的理论底座。
3.4 伪偏导数的更新不是“辨识”,而是“监控”
很多刚开始做MFAC仿真的同学会把伪偏导数的估计过程和传统系统辨识混为一谈,上来就想用最小二乘或者带遗忘因子的递推最小二乘去估计 φ(k),这其实是思路走偏了。
伪偏导数的核心作用不是还原系统某个真实参数,而是跟踪系统在当前工作点附近的“增益状态”。正因为如此,估计算法大多是“数据拟合加变化量惩罚”的组合,目标是让估计值既能解释当前数据,又不会跳得太过剧烈。公式中那个 μ 参数,就是对伪偏导数变化速度的惩罚项,它的大小直接决定了估计值是偏向灵敏还是偏向平滑。
记得在上一篇项目经验的讨论中,有同行开玩笑说伪偏导数“伪”就伪在它不是一个可以被实验单独测出来的量。你换一组控制参数,闭环后的数据不同,在线估计的伪偏导也会不同。它不是被控对象的内禀属性,而是数据模型和控制器共同作用下反映出来的“表观增益”。我后来在仿真中体会得越来越深:MFAC的伪偏导数更像是一个监测系统外部特性的传感器,传感器的读数会受控制器自身行为影响,但是传感器和控制器组合在一起,又确实能让系统稳定运行。想明白这一点,参数整定就变得简单多了。
4. MFAC控制器推导与参数整定逻辑
4.1 先推估计器:为什么要对伪偏导的变化进行惩罚
MFAC控制器的设计通常分两步,第一步是设计伪偏导估计器,第二步是根据等价模型设计控制律。这里我先以紧格式为例,把完整推导过程过一遍。这一块你可能在很多教材和论文里都见过公式,但推导背后的取舍逻辑,往往需要自己钻进去才能看到。
当前时刻 k,我们有上一拍的控制增量 Δu(k-1) 和最新观察到的输出增量 Δy(k),理想情况下这两个量应该满足:
Δy(k) = φ(k) Δu(k-1)
问题在于 φ(k) 未知。估计器要找一个 φ̂(k),让预测误差尽量小。最直接的想法是最小化:
J1 = (Δy(k) - φ̂(k) Δu(k-1))²
光有这个目标函数,估计值会像一个没有阻尼的跟踪器一样,被测量噪声拉得剧烈抖动。为了抑制这种抖振,MFAC的估计准则在原始拟合误差后面加了一个惩罚项:
J1 = (Δy(k) - φ̂(k)Δu(k-1))² + μ (φ̂(k) - φ̂(k-1))²
第二个惩罚项限制的是“估计值相对上一时刻不能变化太快”。μ 越大,估计值变化越“慵懒”;μ 越小,估计值越激进,但也越容易受噪声干扰。μ 在这里还有一个很实际的作用,它能让分母不至于出现奇异性,为算法提供一个数值稳定性底座。
对 φ̂(k) 求偏导数并置零,可以得到伪偏导数的递推估计律:
φ̂(k) = φ̂(k-1) + (η Δu(k-1) (Δy(k) - φ̂(k-1) Δu(k-1))) / (μ + Δu(k-1)²)
这里 η 是步长因子,它控制每一步修正的幅度,通常在0到1之间选取。整个式子的结构特别像把这个领域的梯度下降公式。括号里是上一时刻估计模型对当前输出的预测误差,乘上输入增量,就是对伪偏导方向上的修正量。需要注意的是,式子里的分母带平方项,如果 Δu(k-1) 很小,μ 就承担了防止除法爆炸的作用。
4.2 再推控制律:控制量变化本身也要被约束
拿到伪偏导估计值之后,等价预测模型可以写成:
y(k+1) = y(k) + φ̂(k) Δu(k)
接下来要设计控制输入 u(k),让被控对象的输出 y(k+1) 追上参考轨迹 y*(k+1)。如果只最小化跟踪误差,控制器很可能输出爆炸,因为没有任何机制限制控制量变化幅度。所以控制准则要写成跟踪误差项和控制变化量惩罚项的加权和:
J2 = (y*(k+1) - y(k) - φ̂(k) Δu(k))² + λ Δu(k)²
λ 就是控制量变化惩罚因子。λ 越大,控制器越不乐意大幅改变控制输入,控制量变化越温顺;λ 越小,控制器越“胆大”,但同时更容易激发出系统未建模动态。
对 Δu(k) 求偏导,令偏导为零,可以得到:
Δu(k) = (φ̂(k)(y*(k+1) - y(k))) / (λ + φ̂(k)²)
为了给算法提供一定调节柔性,控制器前面还加了一个步长因子 ρ,得到最终形式:
u(k) = u(k-1) + (ρ φ̂(k)(y*(k+1) - y(k))) / (λ + φ̂(k)²)
从公式结构上可以很清楚看到MFAC控制律的数字特征:它的控制增量由误差项除以一个正数得到,结构上和带时变增益的PI控制器有点像,但这个时变增益不是靠人工经验设定,而是由伪偏导估计器根据在线数据自动给出的。λ 放在分母里与 φ̂(k)² 相加,可以避免 φ̂(k) 过小时控制量被放大到离谱,起到了类似正则化的作用。
4.3 伪偏导估计值的重置机制:安全兜底而不是锦上添花
用这个估计器的时候,有一个典型问题容易被忽略:如果系统突然出现扰动,或者控制输入连续好几拍没有变化,Δu(k-1) 接近零,递推估计修正项的分子和分母同时趋近于零,估计值就可能发生毫无意义的漂移。另一个更常见的问题是,输入输出数据的时间段不够丰富,伪偏导数的估计值忽然改变符号。
符号问题在MFAC里是致命的,因为它代表了控制方向。被控对象本身是正作用方向,如果估计值突然反号,控制律就会朝着增大误差的方向使劲,系统瞬间发散。为了应对这类异常,MFAC算法通常要设置伪偏导数的重置机制。
一个典型的重置策略是这样:
如果 |φ̂(k)| 小于某个阈值ε,或者 Δu(k-1) 的绝对值小于另一个阈值,或者 φ̂(k) 的符号和 φ̂(1) 初始符号不一致,就把 φ̂(k) 重置为初始值 φ̂(1)。
我自己在仿真里的体会是,重置机制不是可有可无,而是整个算法的安全网。尤其是系统经历过大规模设定值切换或外部扰动后,伪偏导估计有可能会被带偏。这时候不重置,控制器就会依靠一个失真的增益模型运行,跟踪速度慢还是小事,严重时整个闭环会出现振荡发散,而重置机制能够把估计值拉回一个相对可信的初值附近重新开始。在最初做仿真时我甚至因为重置条件设置得过宽松,导致伪偏导频繁被重置,控制器退化成一种奇怪的bang-bang行为。后来把阈值调小,同时估计器参数 μ 稍微增大,控制器才表现得正常起来。
4.4 四个调节参数的整定顺序:先稳定估计,再压误差
MFAC尽管号称“无模型”,但参数还是要调的。主要的可调参数是估计律中的 η 和 μ、控制律中的 ρ 和 λ。调参顺序这里必须强调一下,不少人上来就对着 λ 使劲,这其实是本末倒置。
我的建议是先固定控制律参数,把精力集中在估计器参数上,保证伪偏导数的估计轨迹是稳定的、有界的。具体做法是在开环或者闭环运行中观测伪偏导数的变化曲线,如果它大幅度振荡或者频繁触及重置条件,就说明 μ 太小或者 η 太大。这时候先把 μ 量级往上调,再把 η 降低,让伪偏导轨迹变得平滑。估计稳定之后,再回来调 λ 和 ρ。λ 负责抑制控制量波动,ρ 负责调节响应速度。一般的经验是 ρ 可以设置在0.2到1之间,λ 可以从小往大试,每次增大一个数量级,观察控制量的波动和跟踪误差的变化。
还有一点可以在仿真尝试中记住,MFAC对 λ 的敏感度往往低于传统控制器对PID增益的敏感度。因为控制器是数据驱动的,伪偏导会自动适应一部分控制律参数带来的影响。如果仿真中发现参数大范围变化时系统依然能稳定,只是响应快慢不同,这是典型的数据驱动控制器的适应特征,不必觉得奇怪。
4.5 一个容易误解的工程问题:MFAC不是“参数万能自适应”
这里想顺手纠正一个经常被强加给MFAC的误解。很多刚接触的人以为,既然叫无模型自适应,那是不是控制器的参数可以万年不变?实际情况并不是这样。MFAC的自适应主要体现在伪偏导数的在线更新上,它能够适应系统工作点的变化和一定程度的不确定性,但控制器里的 η、μ、ρ、λ 这些参数仍然需要根据对象尺度和控制性能要求做适当选择。
举个实际例子,如果被控对象的执行机构带有明显死区,或者控制量幅值受限,那么 MFAC 的控制律计算出来之后还必须经过限幅处理,否则伪偏导估计器接收到的是限幅前还是限幅后的控制信号,要求必须明确。如果估计器用的是限幅前的 u(k),而被控对象实际接收的是限幅后的信号,两者之间的不一致会直接扭曲估计器的判断。这种问题不是参数自适应能自动解决的,它需要你在仿真架构设计阶段就考虑清楚。
5. 用Matlab搭建MFAC仿真框架:干净的分层结构才能支撑后续实验
5.1 仿真场景怎么选:为什么我推荐非线性带纯滞后对象
做MFAC性能研究时,第一个步骤是选一个合适的被控对象。完全线性、完全无噪声的理想对象当然能让算法跑得很漂亮,但说服力不足,更关键是参数敏感性分析时看不出算法真正的特征。我建议选择一类典型非线性系统作为基准,比如某个常见的最简非线性过程:
y(k+1) = a(k) · y(k) / (1 + y(k)²) + b(k) · u(k)³ + 噪声
其中 a(k)、b(k) 可以随时间缓慢变化,模拟工况漂移。这类对象有三个特点:对象机理复杂,输出对输入有饱和压缩特性,增益随工作点变化。如果再在输入端加上一个纯滞后环节,比如让当前控制输入的影响延迟两拍才显现在输出端,那这个仿真对象就非常有代表性了,既能暴露传统固定模型控制器的问题,也能测试MFAC在时滞下的补偿能力。
控制目标可以设置成方波跟踪,让系统在不同工作点之间切换。方波切换本质上是在考验控制器能否快速适应工作点的突变,突变瞬间伪偏导估计会受到很大冲击,正好用来观察重置机制是否正常工作。
5.2 把程序拆成四层,不要写成一个巨无霸循环
很多控制论文的Matlab代码都是一个超大for循环套到底,所有步骤全塞在一起,改一个参数要全局搜索替换,复现实验特别痛苦。我强烈建议把仿真程序按照控制算法本身的结构拆成四个独立部分:
- 主脚本负责初始化参数、生成参考轨迹、循环调度和画图。
- 被控对象函数接受控制输入和历史状态,返回系统输出,内部实现非线性与时滞。
- 伪偏导估计器函数接受最近的输入输出增量估计值,返回新的伪偏导估计和重置标志。
- 控制器函数接收当前输出、参考值、伪偏导估计,返回控制增量。
这样做的原因不光是代码整洁,更是为了做性能实验的时候能够单独替换某一个模块。比如想对比不同估计器结构,只需要改估计器函数,被控对象、控制器、主循环完全不动,实验结果的可比性就大大增强了。我以前也经历过在主循环里改代码,结果“优化”了一处却悄悄改变了另一处的初值逻辑,导致前后两组数据不可比,非常折磨人。分层之后这种问题基本杜绝了。
5.3 一段最简版的紧格式MFAC核心循环,可直接跑通
下面我给出一段可以直接运行骨架的核心循环,它实现的是紧格式MFAC控制算法。对象选用第4.1节给出的那类带时滞的非线性系统,代码里我已经做了限幅处理,去掉限幅也可以跑,但限幅更贴近真实系统。
matlab复制%% MFAC紧格式核心循环骨架
N = 2000; % 仿真步数
yd = ones(1, N) * 0; % 参考轨迹
yd(200:600) = 1; % 方波指令
yd(1000:1400) = 2;
yd(1600:1800) = 0.5;
% 控制器参数
eta = 0.3; % 估计律步长
mu = 1.2; % 估计惩罚因子
rho = 0.6; % 控制律步长
lam = 0.8; % 控制变化惩罚因子
phi0 = 1.0; % 伪偏导初值,也是重置基准
u = zeros(1, N); % 控制输入
y = zeros(1, N); % 系统输出
y(1) = 0;
u(1) = 0;
phi = phi0; % 当前伪偏导估计
y_limit = 3; % 输出限幅
u_limit = 2; % 控制量限幅
for k = 2:N-1
% 1. 用当前控制作用前一拍的控制量驱动被控对象
% 这里假设滞后一拍,因此使用 u(k-1) 参与计算
y(k) = 0.6 * y(k-1) / (1 + 0.5*y(k-1)^2) + 0.4 * (u(k-1))^3;
y(k) = max(-y_limit, min(y_limit, y(k)));
% 2. 在线估计伪偏导,注意 dy 和 du_prev 的索引
dy = y(k) - y(k-1);
du_prev = u(k-1) - u(k-2);
if abs(du_prev) < 1e-6
phi = phi; % 输入没有变化时不更新
else
phi = phi + eta * du_prev * (dy - phi * du_prev) / (mu + du_prev^2);
end
% 3. 伪偏导重置机制
if abs(phi) < 1e-4 || abs(du_prev) < 1e-4 || sign(phi) ~= sign(phi0)
phi = phi0;
end
% 4. 计算控制增量与当前控制量
du = rho * phi * (yd(k+1) - y(k)) / (lam + phi^2);
u(k) = u(k-1) + du;
u(k) = max(-u_limit, min(u_limit, u(k)));
end
这段代码作为初版实验骨架已经够用,你可以把它继续扩展成偏格式或者全格式。需要提醒的是,代码里我把对象写成滞后一拍的形式,伪偏导重置条件使用了最简策略,这些都是为了降低新手直接上手仿真的门槛。实际研究中请根据对象特性增长滞后步数,并根据伪偏导轨迹的观测结果细化重置阈值。
5.4 调试中最常见的三类问题:初值、同步、控制量
初跑MFAC仿真时遇到问题不要慌,绝大多数坑集中在三个方面。
第一个是伪偏导初值 φ0 的选择。φ0 本质上代表了控制器对系统初始增益方向的先验判断。如果你不知道系统方向是正还是负,可以先做一个简单的开环脉冲测试,看控制输入增加时输出是增是减,据此设定 φ0 的符号。初值符号给反,控制器会表现出“上来就错”,系统会在极短时间内冲到限幅或者发散,排查时看一眼伪偏导轨迹,确认是否总是在朝符号相反方向修正。
第二个是估计器和控制器的数据同步问题。伪偏导估计使用的数据是“上一拍的控制增量”和“本拍的输出增量”,两者必须来自同一个时间对齐关系。如果某次你在修改程序时不小心把 u(k) 和 u(k-1) 的索引写错了一位,系统表现可能不是立即发散,而是会出现持续的慢振荡。这类相位问题很难靠肉眼直接发现,建议在代码里专门定义 du_prev 和 dy 这两个变量,把时间关系固定好再进估计器。
第三个是控制量限幅对估计器的影响。实际系统中执行机构必然有饱和,限幅之后的控制量才是对象真正接收到的量。伪偏导估计器应该使用限幅后实际作用于被控对象的控制信号,而不是限幅前的指令信号。如果两者不一致,估计器会认为对象响应和指令不匹配,从而把伪偏导率方向调错。为了避免这种问题,我这里给控制量加了限幅并直接让限幅后的值进入后面所有计算,这也是我在项目复现中踩过坑之后才固化下来的经验。
6. 性能研究怎么设计,结论才不偏颇
6.1 量化指标不要只看跟踪误差曲线
很多博主谈MFAC仿真效果时,喜欢贴一条跟踪误差很小的曲线就说“效果不错”。真正做性能研究时,至少要同时统计三个层面的量化指标。
第一个是跟踪性能指标,一般用平均绝对误差或积分平方误差来量化,它反映控制器对参考指令的跟随能力。第二个是控制努力指标,统计控制量的变化率绝对值之和或者控制量方差,它能反映执行机构的工作强度和磨损风险。第三个是瞬态性能指标,比如超调量、调节时间、切换后的稳定时间。MFAC本质上是一种数据驱动控制,它的特征往往是控制量变化相对平滑、切换过程不需要剧烈动作,所以在仿真报告里应当分别统计三个指标,才能把这种特征充分体现出来。
以4.3节那段代码为例,如果在方波切换点后统计系统输出第一次越过参考值上方阈值的情况,就能定量判断MFAC相比固定参数PID是否在“控制用力更小”的前提下取得了可接受的跟踪误差。只用误差曲线做对比,很容易得出“MFAC响应慢”的片面结论,因为它的控制量变化更温和,是拿稍长的调节时间换取了更小的执行机构压力。
6.2 对照实验设计:固定PID、带遗忘因子辨识的自适应控制都值得对比
在性能研究中设置对照组时,我建议至少包含以下两种控制器。
第一种是结构简单的固定PID,PID参数可以选择在被控对象某一个工作点上整定良好。这个对照组的目的是说明“固定参数控制器在对象工况漂移后的局限”。当对象工作点变化到另一个区域时,PID参数如果不重新整定,超调量和振荡会明显增加,而MFAC则能通过伪偏导的在线调整保持稳定。
第二种是基于参数辨识的传统自适应控制器,例如对被控对象的局部线性模型做递推最小二乘辨识,再把辨识结果直接用于极点配置控制或最小方差控制。这个对照组的价值在于回答一个很多人关心的问题:同样是数据驱动,MFAC和“在线辨识加先进控制”有什么差别?实践中的结果是,当对象结构相对符合辨识模型时,传统方案可以获得更高精度的控制;但当对象结构明显不匹配,尤其是非线性结构随工况变化较快时,MFAC的鲁棒性优势就显现出来了。
对比时需要注意保持实验条件完全一致,包括噪声序列、参考轨迹、仿真步长、初值。分层的仿真代码结构能帮助你做到这一点,这也是我一直强调代码模块化的重要原因。输出曲线放在同一张图上时,建议附加实现控制量曲线,因为不同控制器的控制努力差异往往比输出曲线更说明问题。
6.3 参数敏感性实验:找出哪些参数对性能真正有杠杆作用
MFAC的可调参数有四个,还有一个初始伪偏导φ0。研究它们对控制性能的影响,属于性能研究里比较有工程价值的内容。一般做法是固定其他参数为基准值,让某一个参数在数量级范围内变化,观察性能指标的响应变化。
我自己实验的体会是,μ 和 λ 这两个惩罚参数对性能的影响呈现一种有意思的“U形”规律。μ 太小时,伪偏导估计对噪声过于敏感,控制量抖动明显;μ 太大时,伪偏导估计跟不上工作点的快速变化,系统在方波切换后的恢复时间会变长。λ 的规律也类似,λ 过小时控制量剧烈甚至诱发抖动,λ 过大时系统响应过于迟缓。η 和 ρ 的影响更接近线性,它们主要控制跟踪速度,过大会导致系统振荡。如果做一张性能指标随参数变化的等高线图,你会发现在μ和λ平面上存在一个相当宽的性能平台,这说明MFAC对参数不是吹毛求疵的敏感,这对工程部署是非常友好的特性。
在研究过程中记录一组经验参数范围很有价值。我经常使用的经验范围是:η在0.2到0.6,μ在0.5到2,ρ在0.3到0.8,λ在0.5到1.5。当然这个范围只适合采样周期适中的离散系统,如果你的仿真步长或者对象尺度差异很大,参数范围要等比例调整。
6.4 鲁棒性试验:真正的价值在对象变化之后才能体现
性能研究里最有说服力的测试是鲁棒性测试。我建议做三类测试,第一类是对象参数漂移,比如在被控对象公式里加入一个随时间缓慢漂移的参数,让系统动态在仿真中途移动到另一个工作区间;第二类是噪声扰动,在输入输出通道加入不同信噪比的测量噪声;第三类是结构突变,比如仿真进行到一半突然在对象输出端叠加一个常量偏置扰动,相当于现场发生了液位计零点漂移之类的故障。
在突加负载扰动这类试验中,MFAC的伪偏导估计会瞬间出现一个跳变,重置机制会把 φ̂ 拉回初值,然后控制器重新适应。这一过程输出上会看到短暂的波动,但这个波动幅度通常远小于没有重置机制的版本。通过对比开不开启重置机制的两个版本,你会真正体会到MFAC不仅能自适应,还自带一套异常恢复策略,这是传统模型控制器不太具备的特性。
6.5 结论该怎么下:不是“MFAC更好”,而是“MFAC在什么前提下够用且可靠”
做了这一套性能研究之后,我个人形成的观点是,写仿真报告时不要简单下“MFAC优于PID”的结论,因为不同场景下的结论可能完全相反。在小惯性、时滞短的系统中,整定良好的PID完全可以做得比MFAC更锐利;在强非线性、工况剧烈变化或者建模成本极高的系统中,MFAC则表现出明显的生存优势。
最能体现MFAC价值的应用画像大致是这样的:被控对象机理较复杂、缺乏准确参数、运行范围会跨多个工作点、系统存在明显非线性但控制方向明确、工程上又希望用一个统一的控制策略解决多个工况的问题。遇到这样的对象,MFAC比花大量精力重新建模靠谱,也比每次切换工作点都重新整定PID省心。把这句话写清楚,研究报告才有真正的参考价值。
经过这几个版本的仿真和调参,我现在遇到一个新的控制对象时,已经习惯先用一个带噪声的非线性仿真模型跑通MFAC,把估计器轨迹画出来看看系统的“表观增益”是怎么变化的,再决定是把控制器搬上实物还是继续退回去用PID。数据驱动并不是一个抽象口号,它最终落到的工作就是:把数据里藏着的动态特性,用伪偏导数这样一个随手可用的在线工具实时抓出来,再顺着它控制下去。
