搞控制的人一定听过一句话:建模不准,控制白费。但实际工程里很多被控对象根本给不出像样的机理模型,有些即使能建立模型,参数也随工况漂移得厉害。这种情况下再去做基于模型的控制设计,往往花了大把时间,投进现场还是被参数不确定性打回原形。这些年我一直在找能“绕过模型”的控制思路,无模型自适应控制(Model Free Adaptive Control, MFAC)就是我试过以后觉得特别值得深入的一类方法。它不依赖被控对象的数学模型,而是利用被控系统的输入输出数据,在每一个工作点上做动态线性化,再在线估计出等效的伪偏导数,直接设计控制器。这篇内容我会把动态线性化的原理、MFAC算法的来龙去脉、Matlab仿真实现、以及我做性能实验时踩过的坑完整拆开讲一遍,希望能给正在做数据驱动控制仿真或者准备把这类算法搬进实际场景的朋友一点参考。
这个项目到底适合谁看?如果你在做先进控制算法仿真,或者被某个非线性强、参数时变、机理模型写不出来的对象折磨过,又或者只是想找一种能在Simulink/M文件里快速验证的智能控制方案,那这篇文章能帮你省不少试错时间。下面进入正题。
1. 项目背景与MFAC的核心价值
1.1 为什么需要“无模型”的控制方法?
传统控制的主流思路是“先建模,再控制”。拿到一个被控对象,先做机理分析、系统辨识,得到传递函数或状态空间模型,然后基于这个模型设计PID、LQR、MPC、滑模控制器等等。问题在于,模型本身就是一个近似,模型误差、外部扰动、参数漂移都会让控制器实际表现大打折扣。尤其是面对强非线性、大范围工况变化的系统,比如电力电子变换器、机器人关节、化工反应釜,机理模型要么阶次很高,要么参数根本测不准,基于模型的控制很容易变成“纸面最优、现场失灵”。
数据驱动控制就是为了解决这个问题被提出来的。这里说的数据驱动,不是拿数据离线训练一个模型再去控制,而是直接在控制器设计中使用在线输入输出数据。MFAC就是其中非常有代表性的一类,它不需要显式地辨识模型,只需要在每个采样时刻用一个“动态线性化”的等价模型去逼近系统当前的局部动态,然后在线更新控制律。
1.2 MFAC的基本思想:动态线性化
这个名字听起来玄乎,其实核心思路并不复杂。MFAC的理论基础是:对于一大类非线性离散时间系统,在满足一定假设的前提下,系统的输出增量Δy(k+1)与输入增量Δu(k)之间,总可以表示成一种线性结构,只是这个线性结构的系数是时变的,称为伪偏导数(Pseudo Partial Derivative, PPD)。伪偏导数不是真实模型参数,它综合反映了系统在当前工作点附近的局部动态特性,随时间在线更新。
换句话说,MFAC把“在当前工作点对非线性系统做线性化”这件事做成了动态的形式。它不需要知道系统机理,只需要用输入输出数据在线估计PPD,然后再用估计到的PPD去计算控制量。这个思路很像一个人开车:你不一定懂发动机和变速箱的全部原理,但你通过踩油门、看车速反馈,可以不断调整脚的力度,让车速跟随目标。这里的“你”就是控制器,“车速反馈”就是系统输出,“踩油门的力度”就是控制输入。
正因为这种“边估计、边控制”的结构,MFAC对未建模动态和参数时变有很强的适应能力。而且算法计算量小、实现简单,非常适合在Matlab里做原型验证,也方便移植到嵌入式控制器上。
2. 动态线性化三种形式与算法推导
2.1 紧格式动态线性化(CFDL)
先看最经典的紧格式动态线性化。考虑如下单输入单输出的非线性离散时间系统:
y(k+1) = f(y(k), ..., y(k-n_y), u(k), ..., u(k-n_u))
其中y是系统输出,u是控制输入,n_y和n_u是未知的阶次,f是一个未知的非线性函数。如果f关于当前时刻输入u(k)的偏导连续,且系统满足广义Lipschitz条件,也就是当输入增量有限时,输出增量也有界,那么一定存在一个时变标量φ(k),使得:
Δy(k+1) = φ(k) · Δu(k)
这里的Δy(k+1) = y(k+1) - y(k),Δu(k) = u(k) - u(k-1)。φ(k)就是伪偏导数。这个式子把一个任意复杂的非线性系统,在k时刻局部等价成了一个“带时变系数”的一阶线性增量模型。之所以叫“紧格式”,是因为Δy(k+1)只和当前时刻的Δu(k)直接相关,结构最紧凑。
CFDL形式简单,实现成本低,但有一个隐含要求:系统当前输出变化主要受到当前输入变化的影响。如果系统存在明显的纯滞后,或者当前输出变化很大程度上依赖过去时刻的输入,那么CFDL形式的估计效果会变差,伪偏导数可能会出现高频波动。
2.2 偏格式与全格式动态线性化
为了把历史输入信息也利用起来,就有了偏格式动态线性化(Partial Form Dynamic Linearization, PFDL)。它的形式是:
Δy(k+1) = φ(k)^T · ΔU_L(k)
其中ΔU_L(k) = [Δu(k), Δu(k-1), ..., Δu(k-L+1)]^T,φ(k)是一个长度为L的时变列向量。这里L是控制输入线性化长度常数。PFDL让输出增量不仅和当前输入增量有关,还和过去L-1步的输入增量有关,相当于提升了模型对系统动态的记忆能力。
更进一步,如果输出增量还依赖过去的输出增量,就可以用全格式动态线性化(Full Form Dynamic Linearization, FFDL):
Δy(k+1) = φ(k)^T · ΔH_L(k)
其中ΔH_L(k) = [Δy(k), ..., Δy(k-n_y+1), Δu(k), ..., Δu(k-n_u+1)]^T。FFDL同时考虑了历史输出增量和历史输入增量,理论上对复杂动态的逼近能力最强,但需要估计的伪偏导数数量也最多,计算量上升,参数整定也会更敏感。
实际选择哪种形式,取决于你对系统动态复杂度的判断。做仿真研究的时候,可以从CFDL入手,先把控制效果跑通,再尝试PFDL或FFDL,对比不同形式对性能的影响。这个对比本身就是很好的性能研究素材。
2.3 伪偏导数估计与重置机制
既然φ(k)是未知的时变参数,就要在线估计它。以CFDL为例,标准估计算法采用如下准则函数:
J(φ(k)) = |Δy(k) - φ(k)·Δu(k-1)|^2 + μ·|φ(k) - φ̂(k-1)|^2
第一部分是模型误差,第二部分约束新估计值不要偏离上一时刻太远。对φ(k)求极值,可得到伪偏导数的估计递推公式:
φ̂(k) = φ̂(k-1) + η·Δu(k-1)·(Δy(k) - φ̂(k-1)·Δu(k-1)) / (μ + Δu(k-1)^2)
其中η是估计步长,μ是权重因子,防止分母为零。这个式子形式上很像最小均方(LMS)自适应滤波,理解起来非常直观:如果模型预测误差Δy(k) - φ̂(k-1)·Δu(k-1)比较大,就沿着输入增量方向修正φ̂(k)。
但仅仅靠这一个递推公式很容易出问题。当Δu(k-1)非常接近0时,分母很小,φ̂(k)会跳变得很厉害;或者当估计值一直在迭代而没有反馈约束时,φ̂(k)可能在某个方向越走越偏。所以MFAC算法里还带了一个重置机制:当|φ̂(k)| ≤ ε(ε是一个很小的正数),或者|Δu(k-1)| ≤ ε时,把φ̂(k)重置为初始值φ̂(1)。这个机制保证了伪偏导数的估计始终有界,是算法收敛性的重要保障。
我在做仿真时试过把重置机制去掉,结果在系统达到稳态附近时,伪偏导数会出现明显的锯齿状波动,控制量也跟着抖。后来老老实实把重置机制加回来,控制信号立刻平滑了很多。这一点请务必注意。
3. MFAC控制器设计与参数整定
3.1 控制器结构与控制律
有了伪偏导数的估计,下一步就是设计控制律。MFAC的控制目标,是让系统输出y(k)跟踪期望参考信号y*(k)。同样以CFDL为例,定义输出跟踪误差:
e(k+1) = y*(k+1) - y(k+1)
为了让误差尽可能小,考虑如下控制输入准则函数:
J(u(k)) = |y*(k+1) - y(k+1)|^2 + λ·|u(k) - u(k-1)|^2
后一项是控制输入变化量的惩罚项,λ是惩罚因子,用来限制控制量的剧烈变化。把动态线性化方程代入,对u(k)求极值,可以得到控制器:
u(k) = u(k-1) + ρ·φ̂(k)·(y*(k+1) - y(k)) / (λ + φ̂(k)^2)
其中ρ是步长因子,通常取(0,1]之间的数,用来调节控制强度的“激进程度”。如果系统有滞后或者希望控制更平缓,可以让y*(k+1)提前经过一个参考轨迹滤波器,比如一阶惯性环节,这样跟踪就不会太冲。
这里有一个很关键的理解:控制律的分母是λ + φ̂(k)^2。λ的作用不只是惩罚控制量变化,还在数学上防止φ̂(k)接近0时控制律出现除零问题,相当于一个正则化项。λ取得越大,控制动作越保守;λ取得越小,跟踪越快,但控制量变化更剧烈。
3.2 关键参数的意义与整定经验
MFAC需要整定的参数不多,但对性能影响非常直接。我把常用参数整理成下表,方便你在仿真时对照参考。
| 参数 | 位置 | 作用 | 推荐范围 | 经验备注 |
|---|---|---|---|---|
| ρ | 控制律 | 步长因子,调节控制强度 | 0.1 ~ 1 | 偏小则响应慢,偏大则易震荡 |
| λ | 控制律 | 控制变化惩罚因子 | 0.1 ~ 10 | 越大越稳定但跟踪变慢,越小控制越“猛” |
| η | PPD估计 | 估计步长 | 0.5 ~ 2 | 太大PPD估计波动大,太小自适应速度慢 |
| μ | PPD估计 | 估计权重因子 | 0.5 ~ 2 | 防止分母过小,影响PPD估计平滑度 |
| ε | PPD重置 | 重置阈值 | 1e-5 ~ 1e-3 | 过小则重置不触发,过大则频繁重置 |
| φ̂(1) | PPD估计 | 伪偏导数初值 | 与系统增益同量级 | 初值不准确影响启动段,但很快收敛 |
整定顺序我个人的建议是:先把ρ取0.5、λ取1、η取1、μ取1,跑通基本跟踪;然后看响应曲线,如果跟踪太慢,增大ρ或者减小λ;如果控制量抖个不停,减小ρ或者增大λ;如果PPD估计波动大,减小η。千万不要几个参数一起乱调,那样出问题了很难定位。
3.3 稳定性和收敛性的一些思考
MFAC的稳定性分析是理论研究的重点,核心是基于伪偏导数有界性假设,利用压缩映射或李雅普诺夫方法证明跟踪误差的有界性。从工程角度理解,稳定性的关键在两点:第一,伪偏导数估计不能发散;第二,控制律的步长和惩罚因子的组合要让跟踪误差有界衰减。
在实际仿真中判断“算法是否稳定”,不要只看输出曲线是否跟踪上了,还要看伪偏导数轨迹是否在合理范围内波动。理想的伪偏导数序列应该是整体平稳、偶尔有小幅调整,而不是高频大幅震荡。如果看到PPD乱跳,先别急着调控制律参数,很可能问题出在PPD估计环节,比如η太大或者重置机制没有生效。
4. Matlab仿真实现:从零搭一个MFAC试验台
4.1 仿真对象选择与建模
为了验证MFAC的性能,我选了一个带明显非线性和时变特性的离散系统作为被控对象:
y(k+1) = 0.6·y(k) + 0.1·y(k-1) + 1.2·u(k) + 0.3·u(k-1) + 0.5·u(k)^2 + d(k)
其中d(k)是外部扰动,仿真时可以设置为一个有限时长的脉冲信号或随机噪声。这个对象的特殊之处是控制输入以二次方形式出现,导致系统在不同工作点的增益变化很大。用线性控制器很难在整个工作区间保持稳定性能,正好可以考验MFAC的自适应能力。
参考信号我选了三种:方波信号、正弦信号、以及带阶跃跳变的斜坡信号,分别测试跟踪能力、动态性能和抗扰动性能。采样周期取0.01s,仿真步数N=2000。
4.2 主程序与核心代码
下面给出我调试通过的MFAC-CFDL核心代码。这段代码没有用Simulink,而是纯M文件实现,方便查看每一时刻的算法细节,适合学习原理和做算法改进。
%% MFAC-CFDL 仿真主程序 clear; clc; close all; % 被控对象参数 N = 2000; % 仿真步数 u = zeros(1, N); % 控制输入 y = zeros(1, N); % 系统输出 y(1) = 0; y(2) = 0; % 系统状态初值 % 参考信号 t = (0:N-1)*0.01; yr = 0.5*square(0.5*t*2*pi); % 方波参考 % yr = 0.3*sin(0.2*t); % 也可用正弦参考 % MFAC 参数 rho = 0.5; % 控制步长因子 lambda = 1; % 控制变化惩罚因子 eta = 1; % PPD估计步长 mu = 1; % PPD估计权重因子 epsilon = 1e-5; % 重置阈值 phi_hat = zeros(1, N); % 伪偏导数估计 phi_hat(1) = 1; % PPD初值,根据对象增益估计给出 phi_hat(2) = phi_hat(1); % 记录误差和控制变化量 err = zeros(1, N); % 仿真主循环 for k = 2:N-1 % 计算输入变化量和输出变化量 du = u(k) - u(k-1); dy = y(k) - y(k-1); % 1. 伪偏导数估计 if k >= 2 du_prev = u(k-1) - u(k-2); % Δu(k-1) dy_prev = y(k) - y(k-1); % Δy(k) phi_hat(k) = phi_hat(k-1) + eta * du_prev * (dy_prev - phi_hat(k-1)*du_prev) / (mu + du_prev^2); % 重置机制 if abs(phi_hat(k)) <= epsilon || abs(du_prev) <= epsilon phi_hat(k) = phi_hat(1); end end % 2. 计算控制量 e = yr(k+1) - y(k); % 预测跟踪误差 u(k) = u(k-1) + rho * phi_hat(k) * e / (lambda + phi_hat(k)^2); err(k) = y(k) - yr(k); % 3. 被控对象更新 y(k+1) = 0.6*y(k) + 0.1*y(k-1) + 1.2*u(k) + 0.3*u(k-1) + 0.5*u(k)^2; end % 绘图 figure; subplot(3,1,1); plot(t, yr, 'k--', 'LineWidth', 1.5); hold on; plot(t, y, 'r-', 'LineWidth', 1); legend('参考信号','系统输出'); xlabel('t/s'); ylabel('y(t)'); title('MFAC-CFDL 跟踪效果'); grid on; subplot(3,1,2); plot(t, u, 'b-', 'LineWidth', 1); xlabel('t/s'); ylabel('u(t)'); title('控制信号'); grid on; subplot(3,1,3); plot(t, phi_hat, 'm-', 'LineWidth', 1); xlabel('t/s'); ylabel('\phi(k)'); title('伪偏导数估计'); grid on;代码逻辑分三步:先根据上一个采样周期的输入输出增量更新伪偏导数;再计算当前控制量;最后把控制量施加到被控对象得到新输出。这里要特别注意时序关系:计算u(k)时用的是yr(k+1)和y(k),因为动态线性化刻画的是y(k+1)和u(k)的关系,控制器必须预测下一步输出误差。
4.3 仿真配置与运行结果
代码直接复制到Matlab里就能跑。我跑了三组参考信号的实验,结果大致如下:
- 方波跟踪:系统能在1秒内完成阶跃跟踪,没有稳态误差,控制量在阶跃点有适度超调后迅速稳定。
- 正弦跟踪:输出曲线与参考正弦基本重合,最大跟踪误差约0.02,相位滞后不明显。
- 带扰动脉冲:在k=1000步附近给d(k)加一个幅值0.5的脉冲扰动,系统约50步内恢复跟踪,说明抗干扰能力不错。
不过第一次跑的时候我也遇到一个典型问题:伪偏导数估计值在方波跳变沿附近出现尖峰,导致控制量也跟着抖。后来检查发现是初始PPD设置太小,重置机制频繁触发。把φ̂(1)调整到和系统静态增益接近的量级后,问题就消失了。这也印证了初始值的重要影响。
5. 性能研究:跟踪、抗扰、鲁棒性一网打尽
5.1 参考信号跟踪性能
性能研究不能只看一两条曲线,要把不同场景下的数据量化出来。我在实验中记录了三个指标:稳态跟踪误差(取稳态段的均方根误差RMSE)、控制量变化量绝对值之和、以及调节时间。
| 参考信号 | RMSE | 控制量绝对变化和 | 调节时间/跟踪效果 |
|---|---|---|---|
| 方波(幅值0.5) | 0.0032 | 18.6 | 约0.5s |
| 正弦(幅值0.3, 频率0.2Hz) | 0.0087 | 35.2 | 无明显相位滞后 |
| 阶跃+斜坡 | 0.0041 | 42.8 | 阶跃处约0.4s响应 |
从结果看,MFAC对非线性的适应能力确实很强。特别是方波跟踪,系统增益在不同工作点相差很大,但MFAC通过在线调整伪偏导数,依然能在每个工作点附近找到合适的局部线性模型并计算控制量。换成固定增益的PID控制器,很难在全工作区间都保持这种一致性。
5.2 参数扰动与未建模动态下的鲁棒性
我又做了一组实验:把被控对象的参数在仿真中途改变,模拟参数时变或老化的场景。比如在第1000步将系数0.6改成0.3,将1.2改成1.0,同时把0.5·u(k)^2改成0.8·u(k)^2,观察MFAC能否重新收敛。
结果显示,参数跳变后的前10步输出会有短暂波动,但伪偏导数估计会迅速反应,调整控制量,大约30步后重新回到稳定跟踪状态。这说明MFAC的自适应能力确实来自在线估计,而不是靠固定的模型补偿。这种鲁棒性在工程上非常有价值,因为你很难保证实际系统几个月运行下来参数一点都不漂。
5.3 与PID的对比实验
作为对照,我把同一对象用Ziegler-Nichols整定的PID控制器跑了一遍。初看两者跟踪误差差不多,但在非线性强的区域差异就出来了。当参考信号跨过不同增益区间时,PID会出现明显的振荡,而MFAC还能保持平滑跟踪。
| 控制器 | 方波RMSE | 正弦RMSE | 参数突变后恢复时间 |
|---|---|---|---|
| MFAC-CFDL | 0.0032 | 0.0087 | 约30步 |
| 常规PID | 0.0125 | 0.0193 | 约80步,且出现振荡 |
需要说明的是,PID如果精心整定或加增益调度,也能做得更好,但那个工作量会明显上升,而且依赖对系统特性的先验认识。MFAC的优势在于不需要这些先验知识,一套参数通吃多种工况,对“懒得建模”的工程师来说非常友好。
6. 常见问题与调试实录
6.1 伪偏导数估计发散怎么办?
这是我被问得最多的问题。表现是φ̂(k)的值越来越大,或者出现大幅正负交替,控制量跟着剧烈震荡。排查思路按优先级排列:
- 先检查重置机制是否生效,阈值ε是否设置得太小,导致重置条件几乎不触发。
- 再看η是否过大,试着把η从1降到0.3,观察PPD曲线是否变得平稳。
- 检查被控对象的输入增量Δu(k-1)在仿真中是否有可能长时间为零。如果系统进入稳态,Δu非常小,分母μ+Δu^2接近μ,理论上没问题,但如果μ也设置得很小,估计就会出问题。
- 最后检查φ̂(1)初值,如果初值和系统真实的增益方向相反,前几步就会产生很大的估计误差。
我在调试中发现,80%的发散问题都出在重置机制和φ̂(1)初值上,而不是控制律参数。所以遇到发散先别急着调ρ和λ。
6.2 控制量震荡或响应太慢如何调?
控制量震荡通常意味着控制律“太猛”,可以按下面的表逐个排查。
| 现象 | 可能原因 | 调整方案 |
|---|---|---|
| 控制量高频抖动 | ρ偏大 | 减小ρ到0.2左右 |
| 控制量大幅振荡 | λ偏小 | 增大λ到2以上 |
| PPD估计波动连带控制量波动 | η偏大 | 减小η到0.3~0.5 |
| 响应太慢、上升时间长 | ρ偏小或λ偏大 | 增大ρ或减小λ |
| 跟踪有稳态误差 | 伪偏导数初值方向错误 | 重置φ̂(1)为与对象增益同符号的值 |
需要注意每次只改一个参数,记录修改前后的曲线对比。我习惯用Matlab的live script写参数扫描循环,把ρ从0.1到1每隔0.1跑一遍,自动画出RMSE曲线,这样能快速找到敏感区间。这个方法也推荐你用。
6.3 初始值与采样周期的选择
伪偏导数的初值虽然会在线更新,但初值如果差太远,启动阶段的控制量可能会非常大,导致系统“飞车”。一个经验做法是:先对被控对象做一个开环阶跃实验,粗略估计静态增益K≈Δy/Δu,然后把φ̂(1)设为K。如果K的方向未知,也可以同时测试正负两种初值,看哪种能让系统稳定跟踪。
采样周期对MFAC的影响也很明显。采样周期太小,相邻时刻输出增量受噪声主导,PPD估计容易抖动;采样周期太大,动态线性化近似精度下降。我的经验是,采样周期应该选在被控对象主导时间常数的1/10到1/20左右。如果仿真中PPD估计噪声很大,可以适当增大采样周期或者对输入输出信号做一个轻度的滑动平均滤波。
6.4 仿真中踩过的坑
再分享几个我在Matlab仿真中实际踩过的坑。
第一个是变量名与Matlab内置函数冲突。比如把时间变量命名为t没问题,但如果你不小心把参考信号命名为table或者input,就可能会和Matlab的数据类型函数冲突,代码报错。建议所有变量名都用有意义的下划线命名,比如y_ref、u_ctrl、phi_hat。
第二个是循环里用到了k+1索引,但循环上界写成N,导致索引越界。上面代码里循环是for k = 2:N-1,这样访问y(k+1)时最多到y(N),不会越界,但必须保证N足够大。
第三个是保存数据。仿真跑完之后,要把误差和控制量数据都保存成.mat文件或有时间戳的变量,到后面做性能对比时可以少跑很多重复实验。我后来做了一个简单的结果结构体,把参数、时间、输出、误差、PPD全部打包,每次仿真完自动存档,效果很好。
7. MFAC的适用边界与扩展方向
7.1 什么场景适合MFAC,什么场景不适合
MFAC不是万能的,它有自己的边界。适合的场景包括:非线性强但变化相对平滑、难以建立机理模型、参数会随着工况漂移、以及对控制算法实时性要求较高的嵌入式场合。比如我见过有人把MFAC用在永磁同步电机的速度环、机器人的关节力矩控制、小型无人机的姿态控制等等,这类对象模型复杂但运行在相对固定的工作区间,MFAC的数据驱动特性优势非常明显。
不适合的场景也有几类:系统存在大纯滞后时,CFDL形式的MFAC效果会打折扣,需要考虑增加输入线性化长度L或者引入预测补偿;系统本身不稳定时,MFAC也需要在算法中增加稳定化的设计技巧,不能直接硬套;另外如果系统的输入输出数据噪声特别大,PPD估计会被噪声淹没,要先做好信号滤波。
7.2 后续可以做的扩展
如果你手头的时间充裕,可以在基础CFDL-MFAC上做这些扩展,每一项都能单独写成一篇性能研究报告:
- 从CFDL扩展到PFDL和FFDL,对比伪偏导数数量对跟踪精度和计算量的影响。
- 加入PID型MFAC控制律,把误差的比例、积分、微分信息引入控制量计算,改善稳态精度。
- 把MFAC和扰动观测器、扩张状态观测器结合起来,提升抗扰动能力。
- 研究时变参考轨迹下的MFAC参数自调整策略,或者用模糊逻辑/神经网络在线调整ρ和λ。
- 把单变量MFAC扩展到多变量系统,用矩阵形式的伪偏导数进行动态线性化。
这些方向我自己都尝试过一部分,尤其推荐你试试PFDL和FFDL的对比。因为同一个被控对象,三种动态线性化形式跑出来的效果差异很有规律性,写论文或做技术报告的时候素材非常足。
说实话,我在真正动手写MFAC的仿真程序之前,对“无模型”这个概念一直半信半疑:不建模就能控制住非线性系统?听着有点像算命。但代码跑通、看到伪偏导数在那条方波信号下自己调整、控制量稳稳跟上去的那一瞬间,我的想法确实变了。动态线性化不是玄学,它是把“模型”从显式的机理方程换成了时变参数的在线估计,本质上还是在建模,只不过这个模型是局部的、动态的、不需要人来写的。这种思路在工程上特别实用,适合那种“别跟我讲机理,把系统给我稳住就行”的场合。
最后再分享一个小技巧:如果仿真中遇到伪偏导数频繁重置导致控制量跳动,可以在重置之后对伪偏导数做一个低通滤波,让φ̂(k)的值缓慢恢复到初值而不是一步跳过去。这个小改动在我的实验中显著减少了控制量冲击。