目录
引言
全格式动态线性化(FFDL)
伪梯度向量更新
控制器设计
仿真验证
后续
引言
无模型自适应控制(Model Free Adaptive Control, MFAC)是一种针对离散时间非线性系统的新型数据驱动控制方法,其核心思想是利用受控系统的输入输出(I/O)数据,通过引入伪偏导数(Pseudo Partial Derivative, PPD)的概念,在受控系统工作点附近构建等价的动态线性化数据模型,进而设计控制器。该方法不依赖被控对象的数学模型,仅基于在线I/O数据即可实现自适应控制,具有结构简单、计算量小、鲁棒性强等优点,已在众多工业过程中得到成功应用。
动态线性化是MFAC的理论基础,根据线性化过程中所利用的I/O数据信息不同,可将其划分为三种主要形式:紧格式动态线性化、偏格式动态线性化和全格式动态线性化(FFDL)。其中,CFDL仅利用当前时刻的输出变化量与输入变化量之间的关系建立线性数据模型,其PPD为一个标量或向量,结构最为简洁,适用于一类相对阶较低且动态特性较为简单的非线性系统。PFDL则引入了滑动时间窗口的概念,将当前时刻附近固定长度窗口内的输入变化量纳入线性化表达,从而能够有效处理输入时滞或高阶动态,但其线性化形式仍局限于输入信息,未考虑输出历史信息的影响。
相比之下,全格式动态线性化(FFDL)进一步拓展了动态线性化的适用范围,它同时利用固定长度窗口内的输入变化量和输出变化量来构建线性数据模型,从而能够更全面地捕获被控系统的复杂动态行为。FFDL所对应的伪偏导数是一个包含输入和输出变化量系数的参数向量,其维数取决于所选的窗口长度。相较于CFDL和PFDL,FFDL在理论上具有更强的表示能力,能够逼近更广泛的一类非线性系统,尤其适用于系统存在未建模动态、强非线性或输出时滞的场合。
全格式动态线性化(FFDL)
考虑单输入单输出非线性系统

其中,y(k)∈R 和u(k)∈R 分别表示系统在k时刻的输出和输入
和
为未知的阶数;
是未知的非线性函数。
为实现动态线性化,如下基本假设成立:
假设 1: 系统关于各变量连续可微,且满足广义 Lipschitz 条件,即对任意 k 和有限的输入变化,系统输出变化有界:
其中
,
,
为正整数(称为控制输入线性化长度常数),b 为正常数。
假设 2: 系统对于期望的参考轨迹具有可控性,即存在有界输入使得输出能够跟踪参考信号。
满足以上假设则存在一个伪梯度向量
,将上述非线性函数等价成如下形式:

其中H(k)为包含过去时刻输入输出信息的向量:

其中
和
被称为伪阶数表示控制输入线性化长度常数。
伪梯度向量更新
采用带有可变遗忘因子的投影算法估计
,目标函数为:

其中
是权重因子。对上述公式取极值得到:

其中
是步长因子。
控制器设计
采用一步前向加权控制输入准则函数:

其中
是控制输入变化量的权重因子。将数据模型
代入,并对
求导并令其为零,得到控制律:

其中
是步长因子,而

是从
中移除当前时刻
项并将对应位置置零后的向量。
是伪梯度向量中对应于
的分量。
仿真验证
-
工具选择:MATLAB
被控对象示例:非线性系统
选取非线性系统为:

CFDL算法PFDL算法和PID算法详见文章偏格式动态线性化下的无模型自适应控制与PID算法程序对比,全格式动态线性化下的MFAC程序:
clear; close all; clc;
%% 仿真参数
N = 800;
T = 0.01;
t = (0:N-1)*T;
%% 正弦信号
A = 1.2;
f = 0.8;
y_d = A * sin(2*pi*f*t);
%% 初始化变量
u = zeros(1, N); % 控制输入
y = zeros(1, N); % 系统输出
% 全格式参数设置
Ly = 2; % 输出增量阶数
Lu = 3; % 输入增量阶数
L = Ly + Lu; % 伪梯度向量维数
phi = zeros(L, N); % 伪梯度向量
% 初始状态
y(1) = 0; y(2) = 0;
u(1) = 0; u(2) = 0;
phi(:,1) = ones(L, 1);
%% FFDL-MFAC 参数
rho = 0.45; % 控制率步长因子
lambda= 0.00001; % 控制率权重因子
eta = 0.4; % 伪梯度估计步长因子
mu = 1.0; % 伪梯度估计权重因子
epsilon = 1e-5;
%% 主仿真循环
for k = 2:N-1
Delta_y_vec = zeros(Ly, 1);
for i = 1:Ly
if k-i+1 >= 1
Delta_y_vec(i) = y(k-i+1) – y(max(k-i, 1)); % Δy(k-i+1) = y(k-i+1) – y(k-i)
else
Delta_y_vec(i) = 0;
end
end
Delta_u_vec = zeros(Lu, 1);
for i = 1:Lu
if k-i+1 >= 1
if k-i >= 1
Delta_u_vec(i) = u(k-i+1) – u(k-i);
else
Delta_u_vec(i) = u(k-i+1) – 0;
end
else
Delta_u_vec(i) = 0;
end
end
Delta_HL = [Delta_y_vec; Delta_u_vec];
phi_y = phi(1:Ly, k);
phi_u = phi(Ly+1:end, k);
phi_u_2toLu = phi_u(2:end);
known_part = phi_y' * Delta_y_vec + phi_u_2toLu' * Delta_u_vec(2:end);
e_star = y_d(k+1) – y(k) – known_part;
phi_u1 = phi_u(1);
denom = lambda + phi_u1^2;
if abs(denom) < epsilon
delta_u = 0;
else
delta_u = rho * phi_u1 / denom * e_star;
end
u(k+1) = u(k) + delta_u;
%% 系统响应
y(k+1) = 0.5*y(k) + 0.3*y(k-1) + u(k+1)^3 / (1 + y(k)^2) + 0.2*u(k) + 0.1*u(k-1);
%% 伪梯度估计
Delta_y_est = Delta_y_vec;
Delta_u_vec_est = Delta_u_vec;
Delta_u_vec_est(1) = delta_u;
Delta_HL_est = [Delta_y_est; Delta_u_vec_est];
Delta_y_kp1 = y(k+1) – y(k); % Δy(k+1)
est_error = Delta_y_kp1 – phi(:,k)' * Delta_HL_est;
denom_est = mu + Delta_HL_est' * Delta_HL_est;
if denom_est < epsilon
phi_new = phi(:,k);
else
phi_new = phi(:,k) + (eta * Delta_HL_est / denom_est) * est_error;
end
if norm(phi_new) < epsilon || sign(phi_new(1)) ~= sign(phi(1,1))
phi(:, k+1) = phi(:,1);
else
phi(:, k+1) = phi_new;
end
end
%% 绘图
figure('Position', [100 100 800 600]);
subplot(2,1,1);
plot(t, y_d, 'r–', 'LineWidth', 1.5); hold on;
plot(t, y, 'b-', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('输出 y');
legend('期望轨迹', 'FFDL-MFAC 实际输出');
title(['FFDL-MFAC (Ly=', num2str(Ly), ', Lu=', num2str(Lu), ') 正弦轨迹跟踪']);
grid on;
subplot(2,1,2);
stairs(t, u, 'g-', 'LineWidth', 1);
xlabel('时间 (s)'); ylabel('控制输入 u');
title('控制器输出');
grid on;
结果展示:

从上图可以看出,在存在滞后等强耦合强非线性条件下,全格式动态线性化下系统误差最小,稳定性最强。
后续
- 完善稳定性证明
- 复现论文
