☰
不确定非线性系统H∞跟踪控制:积分强化学习与在线神经网络实现
2026/9/29 15:22:25 网站建设 项目流程

简介:面向研究不确定非线性系统H∞跟踪控制问题的科研与工程人员,这份资源复现了基于积分强化学习(IRL)的在线模型无关控制方案,重点解决Hamilton-Jacobi-Isaacs(HJI)方程求解难题。方案通过评价-执行-干扰三神经网络同步更新,配合Lyapunov分析证明稳定性,并引入鲁棒项抑制逼近误差,适用于含外部干扰和输入约束的场景。包体为单个docx文档,约49KB,文中提供基于Python的可运行代码及逐段解释,覆盖折扣非二次成本函数设计、评价-执行-干扰三类神经网络结构、IRL在线更新流程、鲁棒项构造和两个仿真示例的结果分析,便于读者按图索骥复现实验。目前已有153人学习下载,适合具备一定编程基础、希望掌握神经网络与积分强化学习结合实践的读者。

1. 不确定非线性系统的H∞跟踪控制:积分强化学习为什么值得试

做非线性系统的H∞跟踪控制,最卡人的不是控制器推导本身,而是你手里的模型几乎永远对不上真实对象。未建模动态、负载变化、增益不确定性都会让精心推导的鲁棒控制参数变成一张废纸。积分强化学习(Integral Reinforcement Learning, IRL)给了一条不同的路:它不要求你精确知道系统动力学,而是沿真实轨迹采样奖励积分,用神经网络在线逼近值函数,再从中提取鲁棒跟踪控制律。这篇文章把从问题建模、积分贝尔曼方程到MATLAB在线学习的实现整条链路走一遍,并把我在这个方向上踩过的坑逐条列出来。适合正在复现自适应动态规划(ADP)论文的研究生,以及想评估在线学习方案能否落到实际控制工程里的工程师。

2. 把H∞跟踪问题改写成可学习的博弈形式:IRL的关键一步

想理解积分强化学习在鲁棒跟踪里的位置,得先把“不确定非线性系统的H∞跟踪控制”这个标题拆成能写进代码的数学形式。这一章全程围绕一个问题:怎么把鲁棒控制变成可以靠数据迭代求解的问题。

2.1 误差动力学与不确定性建模:先分清哪些是模型、哪些是“敌人”

考虑一个二阶不确定非线性系统:

ẋ₁ = x₂ ẋ₂ = f(x) + g(x)u + d(t)

其中 x = [x₁, x₂]ᵀ,u 是控制输入,d(t) 是外部扰动。这个形式在机械臂、飞行器姿态、电机驱动里很常见:第一个方程是运动学关系,第二个方程含动力学和输入。

为了把“不确定”落到具体处,我在仿真里这样设置:

f(x) = -x₁ - 0.3x₂ + 0.2x₁x₂ g(x) = 1 + 0.1sin(x₁)

设计者手里只有标称模型 f_nom(x) = -x₁ - 0.3x₂,g_nom = 1。那 0.2x₁x₂ 和 0.1sin(x₁) 就是所谓的“不确定项” —— 前者代表未建模动态,后者代表控制增益的摄动。实际工程里这两项可能是摩擦力矩、负载变化或执行器死区;在仿真里,我们把它们装进“真实对象”,但绝不告诉设计者。这就是整个问题的来源:模型对不上,却还要保证闭环系统对外部扰动有规定的抑制水平。

跟踪任务的定义是让 x₁ 跟踪一条光滑参考轨迹。参考轨迹取 x_d1(t) = 0.5sin(t),则 x_d2(t) = 0.5cos(t),其二阶导 ẍ_d1(t) = -0.5sin(t)。定义跟踪误差:

e₁ = x₁ - x_d1 e₂ = x₂ - x_d2

对误差求导,得到误差动力学:

ė₁ = e₂ ė₂ = f(x) + g(x)u + d(t) - ẍ_d1

注意最后一项 ẍ_d1 是已知的参考加速度,这一项会作为已知的时变信号进入控制器,这是后面代码里需要保留的项。对设计者而言,误差动力学就是 ė = F(e,t) + G(e)u + D(t)d(t),其中 G 只能取标称值 g_nom,实际增益和标称值的偏差就是鲁棒控制要吸收掉的“敌人”。

提示:参考轨迹尽量选光滑周期信号。阶跃参考会让误差快速归零,在线学习采样不到足够信息,后面持续激励一节会再解释。

2.2 H∞指标与两人零和博弈:γ 参数反映性能与可行域

H∞跟踪控制不是要“误差尽量小”这种模糊说法,它给的是一个显式的能量比不等式:

∫₀^∞ (eᵀQe + uᵀRu) dτ ≤ γ² ∫₀^∞ dᵀd dτ + V(e(0))

这个不等式的工程含义是:从外部扰动 d 到“误差加控制能量”这个输出通道的 L2 增益不超过 γ。γ 越小,同样能量的扰动对被控量的影响越小,控制性能越强;但代价是 HJI 方程存在解的可行域变窄,γ 小到一定程度问题就无解。常见做法是先取 γ = 1.5~2.0,跑通了再逐步下调试探边界。

这个不等式形式上不好直接求解。但控制输入和扰动方向正好相反,可以把它改写成两人零和博弈:控制输入 u 是最小化性能的一方,外部扰动 d 是最大化性能的一方。定义值函数:

V(e) = min_u max_d ∫₀^∞ (eᵀQe + uᵀRu - γ²dᵀd) dτ

这个 V(e) 满足哈密顿-雅可比-伊斯克斯方程(HJI 方程)。对误差动力学 ė = F + Gu + Dd 写出具体形式:

0 = eᵀQe + ∇VᵀF - (1/4)∇VᵀGR⁻¹Gᵀ∇V + (1/(4γ²))∇VᵀDDᵀ∇V

其中最优控制与最坏扰动可以显式解出来:

u* = -(1/2)R⁻¹Gᵀ∇V d* = (1/(2γ²))Dᵀ∇V

现在问题的性质变了:原本要直接设计控制器 u,现在变成了求值函数 V(e)。而 HJI 方程是一个偏微分方程,对不确定非线性系统基本不存在解析解——这就是神经网络进场的地方。

2.3 积分贝尔曼方程:绕过系统模型的核心操作

经典强化学习用瞬时奖励做时序差分,但在连续时间系统上会碰到 V 对时间的导数项,对测量噪声非常敏感。积分强化学习的核心改动是:在一个固定时间区间 [t, t+T] 上积分贝尔曼方程,而不是看瞬时值。

从博弈值函数出发,对任意时刻 t 和区间长度 T,有:

V(e(t)) = ∫ₜ^{t+T} (eᵀQe + uᵀRu - γ²dᵀd) dτ + V(e(t+T))

把 V(e) 用神经网络 V̂(e) = Wᵀσ(e) 代替,就得到:

Wᵀ[σ(e(t)) - σ(e(t+T))] ≈ ∫ₜ^{t+T} (eᵀQe + uᵀRu - γ²dᵀd) dτ

这条等式是这个标题里最核心的可计算对象。它有两个关键性质:第一,方程里没有显式出现 f(x),模型不确定部分的误差以积分形式被平均掉了,你只需要测量状态轨迹和奖励积分;第二,它天然适合在线实现——每隔 T 秒采样一个数据点,喂给最小二乘或递推算法更新 W,不需要任何离线训练集。

另一方面,这条等式用的是“近似值函数”,神经网络逼近误差是必然存在的。所以后面仿真得到的不是等号,而是一个带残差的方程;权重更新就是把残差往最小二乘意义下压。这也是为什么积分区间 T 不能取太大——T 越大,神经网络逼近误差在区间内累积越多。

3. 神经网络在线学习设计:单Critic结构与权重更新参数

HJI 方程没解析解,我们用神经网络去逼近值函数 V(e)。这一章讲网络结构怎么选、权重更新怎么写、激励条件怎么保证。这些决定仿真能不能收敛,也是和普通监督学习最不一样的地方。

3.1 选前馈网络还是多项式基:单Critic网络的取舍

标准 ADP 文献里常见的是 Actor-Critic 双网络:一个网络逼近值函数,另一个网络逼近控制策略。但在本文这个具体问题里,最优控制律已经有解析表达式 u* = -(1/2)R⁻¹Gᵀ∇V,只要能算出值函数的梯度,控制器就直接出来了。所以一个 Critic 网络就够,不需要单独的 Actor 网络。这种单网络结构参数少,在线更新的计算量小,收敛也快,我一般优先试它。

网络本身我推荐用多项式基而不是带激活函数的多层前馈网络。对二阶系统,取 2 次和 4 次单项式共 8 个特征:

σ(e) = [e₁², e₁e₂, e₂², e₁⁴, e₁³e₂, e₁²e₂², e₁e₂³, e₂⁴]ᵀ

选 2 次项是因为 LQR 意义下的值函数是二次型,2 次项能覆盖线性控制的基准;选 4 次项是为了能逼近非线性系统的非二次值函数。这里有个容易忽略的细节:σ(e) 里没有一次项。对原点附近的调节问题,值函数通常是状态的正定函数,一次项在原点处梯度不为零,会让控制器在原点附近产生恒定偏置,不合理。

多项式基本质上就是一层不带激活函数的前馈网络,好处是梯度的解析式完全写死,不需要反向传播,在线更新时数值上非常稳定。代价是它对状态范围敏感:多项式阶数越高,|e| > 2 之后特征值暴涨。所以后面代码里要么限制状态范围,要么先做归一化,否则训练很容易变成 NaN。

3.2 RLS权重更新:从积分贝尔曼误差到逐样本递推

上一章的积分贝尔曼方程 Wᵀ[σ(e(t)) - σ(e(t+T))] ≈ ∫ r dτ 对每一个采样区间都构成一个线性方程。收集一批样本后,一次性解最小二乘 W = (ΦᵀΦ)⁻¹ΦᵀY 就是离线版本,适合做事后分析。

在线实现时我用递归最小二乘(RLS),每来一个样本就更新一次权重,不需要保存大批历史数据。标准 RLS 递推式是:

P_k = (1/λ)[P_{k-1} - P_{k-1}φ_kᵀφ_kP_{k-1} / (λ + φ_kP_{k-1}φ_kᵀ)] W_k = W_{k-1} + P_kφ_kᵀ(y_k - φ_kW_{k-1})

其中 φ_k = [σ(e(t)) - σ(e(t+T))]ᵀ 是 1×8 行向量,y_k 是区间奖励积分。遗忘因子 λ 越接近 1,对旧数据记忆越长、更新越平滑;λ 明显小于 1 时对新数据响应更快,但权重波动也更大。我通常在 0.99~0.999 之间选,仿真里取 0.995。这个值不是玄学:在线学习过程中系统参数和参考轨迹都在变,给一点遗忘能力才能持续跟踪。

P 矩阵的初始值 P₀ 也很关键。取太小,前几步更新几乎不动;取太大,前几个样本可能把 W 冲过头导致发散。常见做法是取 1e-3 到 1e-1 的对角阵,代码里我取 1e-2。

3.3 探测噪声与持续激励:训练收敛的前提条件

这是在线强化学习最容易翻车、也最常被忽略的一环。神经网络权重能收敛,前提是输入数据覆盖足够多的方向——学控制理论的人习惯叫它持续激励条件。放到这个仿真里:如果参考轨迹是常数,误差很快归零,采到的 σ(e) 全在原点附近,RLS 更新矩阵 P 的信息量趋近于零,权重卡住不动。

解决办法是往控制输入里叠加探测噪声(probing noise)。代码里我用均匀分布随机数乘一个随指数衰减的包络:前期噪声幅度大,保证状态被充分激励;后期噪声衰减,保证跟踪精度不受影响。噪声幅度不是越大越好——太大直接把跟踪性能打崩,太小持续激励不满足。我的经验是初始幅度取控制量量级的 0.2~0.5 倍,衰减时间常数取总仿真时长的 1/3 左右。这个折中能在“信息量”和“控制品质”之间站住脚。

提示:判断激励是否足够的土办法,是把 RL 权重更新关掉,只跑系统加探测噪声,然后看误差状态是否在两个方向上都有明显波动。如果 e₁、e₂ 曲线都贴在零轴上,噪声幅度必须加大。

4. 用MATLAB跑通最小仿真:完整代码与跑通参数

这一章给出可在 MATLAB 里直接运行的最小实现。仿真对象就选第 2 章那个带未建模动态和增益摄动的二阶系统,控制器由单 Critic 网络生成,权重用 RLS 在线更新。代码分三段贴:参数与网络初始化、主循环、结果绘图。

4.1 仿真对象与参数预设

%% 参数与初始化 dt = 0.001; % 仿真步长,单位 s T = 20; % 总仿真时长 t = (0:dt:T)'; N = length(t); % 参考轨迹及其二阶导数 xd1 = 0.5*sin(t); xd2 = 0.5*cos(t); xdd1 = -0.5*sin(t); % 性能权重与 Hinf 指标 Q = [10 0; 0 1]; R = 1; gamma = 1.2; % 初始状态 x = zeros(2, N); x(:,1) = [0.3; -0.2]; u = zeros(N, 1); d = zeros(N, 1); % 多项式基:2 次 + 4 次单项式,共 8 个特征 basis = @(e) [e(1)^2; e(1)*e(2); e(2)^2; e(1)^4; e(1)^3*e(2); e(1)^2*e(2)^2; e(1)*e(2)^3; e(2)^4]; dbasis = @(e) [2*e(1) 0; e(2) e(1); 0 2*e(2); 4*e(1)^3 0; 3*e(1)^2*e(2) e(1)^3; 2*e(1)*e(2)^2 2*e(1)^2*e(2); e(2)^3 3*e(1)*e(2)^2; 0 4*e(2)^3]; % 初始权重:用 LQR 近似值函数 V = e'*P*e 填充二次项 P0 = [2.0 0.5; 0.5 0.8]; W = zeros(8, 1); W(1) = P0(1,1); W(2) = 2*P0(1,2); W(3) = P0(2,2); % RLS 参数 P_rls = 1e-2 * eye(8); lambda_rls = 0.995; % IRL 积分区间 T_ir = 0.05; N_ir = round(T_ir / dt); acc_e = 0; acc_u = 0; acc_d = 0; % 探测噪声:幅度递减,保证持续激励 noise_amp = 0.5; noise_decay = exp(-0.3*t); % 记录数组 W_log = zeros(N, 8); err_log = zeros(N, 1);

这段代码里有两个容易误设的参数:Q 矩阵取 diag(10,1) 表示对位置误差的惩罚远大于速度误差,这在实际跟踪问题里合理——用户关心的是输出位置是否跟住参考。gamma 取 1.2 是试探值,如果后面发现收敛困难,优先从这里调大。P0 矩阵是我随手给的稳定正定阵,它的作用只是让初始控制器别把系统推到发散,不需要精确。

4.2 主循环、IRL样本采集与RLS权重更新

%% 主循环:仿真推进 + IRL 样本生成 + RLS 更新 for k = 1:N-1 % 当前误差状态 e1 = x(1,k) - xd1(k); e2 = x(2,k) - xd2(k); e = [e1; e2]; % 外部扰动:两个正弦叠加,有界且能量有限 d(k) = 0.4*sin(2*t(k)) + 0.2*cos(3*t(k)); % 由 Critic 网络梯度生成控制信号(标称增益 g_hat = 1) g_hat = 1; dVde = dbasis(e)' * W; % 2x1 梯度向量 u_base = -0.5 / R * g_hat * dVde(2); % 控制加在第二个状态方程 % 叠加递减探测噪声,保证持续激励 u(k) = u_base + noise_amp * noise_decay(k) * (rand - 0.5); % 实际系统更新:含未知非线性 0.2*x1*x2 与增益摄动 0.1*sin(x1) f_actual = -x(1,k) - 0.3*x(2,k) + 0.2*x(1,k)*x(2,k); g_actual = 1 + 0.1*sin(x(1,k)); xdot = [x(2,k); f_actual + g_actual*u(k) + d(k) - xdd1(k)]; x(:,k+1) = x(:,k) + dt*xdot; % 区间奖励积分 acc_e = acc_e + (e'*Q*e)*dt; acc_u = acc_u + R*u(k)^2*dt; acc_d = acc_d + gamma^2*d(k)^2*dt; % 每 T_ir 秒生成一个 IRL 样本 if k >= N_ir && mod(k, N_ir) == 0 e_start = x(:,k-N_ir+1) - [xd1(k-N_ir+1); xd2(k-N_ir+1)]; e_end = e; phi_row = (basis(e_start) - basis(e_end))'; % 1x8 y_row = acc_e + acc_u - acc_d; % 标量 % RLS 在线更新 P_rls = (1/lambda_rls) * ... (P_rls - P_rls*(phi_row')*(phi_row)*P_rls / ... (lambda_rls + phi_row*P_rls*(phi_row'))); P_rls = (P_rls + P_rls') / 2; % 保证对称 W = W + P_rls * phi_row' * (y_row - phi_row * W); % 清空区间积分 acc_e = 0; acc_u = 0; acc_d = 0; end % 记录 W_log(k,:) = W'; err_log(k) = norm(e); end

主循环里有几个顺序细节值得说明。探测噪声必须在系统更新之前叠加进 u(k),因为实际执行到对象上的控制输入包含噪声,奖励积分也必须用这个实际输入计算;如果先用无噪声控制推进系统再去加噪声做奖励积分,样本就对不上号了。

每个 IRL 样本由三部分组成:起点和终点的特征差、区间奖励积分。代码在 mod(k, N_ir) == 0 时采样一次,起点状态取 k-N_ir+1 步之前的历史值,终点状态取当前值。这样窗口长度正好是 N_ir 步,对应物理时间 T_ir = 0.05s。需要强调的是,这个区间长度要覆盖系统主导时间尺度的一个零头,不能太短也不能太长——太短样本噪声占比大,太长神经网络逼近误差在区间内累积。

RLS 更新那三行是核心:第一行更新 P 矩阵,第二行做对称化防数值漂移,第三行用增益乘以残差去修正 W。遗忘因子 λ=0.995 意味着约 200 个样本之后旧数据权重降到 1/e 以下,对于 20 秒仿真产生的 400 个样本来说,中段之后基本靠近期数据驱动。

4.3 从曲线判断学习是否成功

%% 结果绘图 figure; subplot(2,1,1); plot(t(1:end-1), err_log(1:end-1)); xlabel('t (s)'); ylabel('||e||'); title('跟踪误差范数'); subplot(2,1,2); plot(t(1:end-1), W_log(1:end-1, 1:3)); xlabel('t (s)'); ylabel('W'); legend('W1','W2','W3');

运行这段代码,理论上你会看到三个现象:前 5 秒误差范数有明显波动,这是探测噪声引起的激励;随着噪声衰减,误差范数逐步稳定到零点附近的小邻域内,体现跟踪性能;W 的三个二次项权重从初始值快速调整,10 秒后基本不再大幅变化,说明学习收敛。如果误差曲线在后期明显增大,优先检查是否探测噪声幅度衰减过慢;如果 W 曲线从头到尾几乎不动,优先检查持续激励条件。这些曲线比任何理论分析都更直接告诉你算法是否在工作。

参数选择汇总如下表,仿真时最常动的就是 gamma、noise_amp、lambda_rls 三个:

参数取值说明
dt0.001 s固定步长,越小越稳,但总步数增多
Qdiag(10,1)位置误差惩罚远大于速度误差
R1控制能量权重,越大控制越保守
gamma1.2扰动抑制水平,越小要求越高,可能无解
T_ir0.05 sIRL 积分区间,需覆盖系统动态的关键尺度
lambda_rls0.995遗忘因子,接近 1 则记忆越长
noise_amp0.5探测噪声初始幅度,按控制量量级调整
P_rls 初值1e-2·I初始协方差,决定前几步更新步长

5. 在线学习的常见问题与避坑记录:五个真实翻车点

写代码跑通是一回事,跑通之后换参数、换系统再调试,才能真正理解这个算法。下面五条是我在这类在线学习方案里反复踩过的坑,每条按现象、原因、解决三个层次写。

5.1 权重更新成NaN:病态矩阵与特征爆炸

现象:RLS 更新十几步之后,W 突然变成 NaN,跟踪误差曲线断开,仿真直接报废。这种情况通常发生在状态跑出 [-3, 3] 范围之后。

原因:两层。第一层是多项式基的指数特性——四次单项式在 |e| 超过 2 之后增长极快,状态一发散特征值就是几百上千,P_rls 矩阵变得病态。第二层是 RLS 里 P 矩阵在连乘连除后失去正定性,数值误差逐步累积,最后更新增益变成无意义的巨大数。

解决:给控制输出加饱和限幅,u 限制在 [-2, 2];P_rls 初始值从 1e-2 降到 1e-3;每次更新后做对称化,甚至强制修正特征值保证正定;如果状态已经发散,直接复位 W 到初始值重新跑。工程上最省事的土办法是在进入 RLS 更新前检查 norm(e) 是否超过阈值,超过就直接跳过本次更新——反正这个样本质量也差。

5.2 训练不收敛:激励不够,误差卡在半山腰

现象:误差曲线前期下降,但到某个水平就再也不动了;W 曲线只在最开始动几步,后面变成一条直线。很多人这时候去调学习率、调遗忘因子,调半天没用。

原因:数据没有信息量。误差接近零之后,σ(e) 所有元素都趋近零,IRL 样本的 φ_row = σ(e_start) - σ(e_end) 也趋近零向量,RLS 更新对 W 几乎没有修正。这是持续激励条件不满足,不是学习率的问题。

解决:加大探测噪声的初始幅度或延长衰减时间;把参考轨迹从阶跃改成周期正弦;在误差快速收敛到零的工况里,甚至需要主动往参考轨迹上叠加小幅高频分量。我的经验是:先关掉 RLS 更新,给系统加噪声跑 2 秒,然后看误差状态的轨迹是不是覆盖了一个二维区域。如果 e₁、e₂ 的散点图挤成一条线,说明激励不够。

5.3 仿真一开始就爆:初始W必须对应一个稳定策略

现象:仿真跑不到 0.1 秒,x₂ 直接飞到上百,后面全是 NaN。

原因:初始权重 W 是随机或者任意给的,对应的控制律可能把系统推向不稳定方向。神经网络在线学习并不是“从零学起”的算法,它需要一个能稳住系统的初始策略做底子,在线更新只是在这个基础上去优化。初始权重太差,系统状态发散,采到的样本全是发散轨迹上的数据,什么更新都救不回来。

解决:先用 LQR 在标称线性系统上算一个近似值函数,把二次项系数填进 W 的初始值,代码里 P0 矩阵就是干这个的;再确认控制律公式的符号——dVde(2) 前面那个负号错了,系统第一步就爆。调试时先固定 W 关闭更新,确保开环加初始控制器能跑满 1 秒,再开 RLS。

5.4 γ设太小导致怎么调都不收敛:HJI方程的可行域边界

现象:无论怎么调学习率、噪声幅度、遗忘因子,误差就是压不下去,事后算 L2 增益总是比设定的 γ 大不少。

原因:H∞ 博弈问题对 γ 有一个可行域边界,γ 小于某个临界值时 HJI 方程不存在满足不等式的解。这不是学习算法的参数问题,而是问题本身在数学上无解。你把算法逼到极限,它只能给你一个次优结果——不稳定或不达标。

解决:把 γ 从 1.2 往上调,比如 1.5、2.0,跑通后感受一下性能变化,再用二分法试探临界值。实际工程的合理顺序是:先用大 γ 把系统稳住、让学习收敛,确认整条链路是对的,再逐步调小 γ 逼近性能极限。一上来就设一个理想的小 γ,基本会卡在调试瘫痪状态。

5.5 论文复现符号对不上:1/2系数、Q与R的权重口径

现象:按某篇论文的公式实现,代码却怎么都复现不出论文报告的误差曲线,差得不是一点点。

原因:文献里 H∞ 跟踪控制的写法存在口径差异。控制律有的写 u = -R⁻¹Gᵀ∇V,有的写 u = -(1/2)R⁻¹Gᵀ∇V;值函数积分里有的用 eᵀQe + uᵀRu,有的把 Q 换成包含 R 的扩维矩阵。这些系数差异会直接改变网络权重的收敛方向和稳态值。还有一个常见问题:有些论文里 d 的惩罚项写作 -γ²‖d‖²,有些写作 -(1/2)γ²‖d‖²,导致最坏扰动 d* 的表达式差一倍。

解决:动手前先把论文里定义值函数的那一段精读三遍,把 u*、d* 的表达式手工推导一遍再写代码;用标称线性系统加 LQR 结果做对照,验证自己实现的控制律梯度方向对不对。不要迷信论文公式直接抄,那是最容易踩的隐坑。

如果从零开始写这个仿真,我的调试顺序是:先固定 W 不更新,跑通状态、扰动与控制律,确认系统不发散;再开 RLS 但关闭探测噪声,看 W 是否完全不动——不动是正常的,说明激励那句代码还没加对;最后加噪声,看 W 是否开始移动。每一步只引入一个变量,出了问题一眼就能定位。直接跑完整代码,翻车了都不知道去哪查。

6. 验证H∞性能与几个进阶方向:确定方案值得投入再加深

学习收敛只是第一步,更关键的问题是:这个控制器真的满足 H∞ 性能吗?对不确定性真有鲁棒性吗?这一章讲怎么数值验证,以及往哪儿进阶。

6.1 用外部扰动实验估计实际L2增益

仿真跑完后,用记录的数据直接算实际 L2 增益估计值:

γ_est = sqrt( ∫₀^∞ (eᵀQe + uᵀRu) dτ / ∫₀^∞ dᵀd dτ )

严格说这个比值应该取所有非零扰动信号下的上确界,实际仿真只能用有限信号近似,所以见到 γ_est 比设计值 γ 小 10%~20% 就算合格。计算时建议跳过前 3 秒的暂态段,只统计后续数据——初始误差大时扰动到误差的比值偏高,会把合格结果误判成不合格。

6.2 对不确定性系数做扫描测试

一个控制器说自己“鲁棒”,必须有证据。把实际系统 f(x) 里 0.2x₁x₂ 的系数从 0.1 改成 0.5,g(x) 里 0.1sin(x₁) 的幅度从 0.05 改成 0.2,固定已经学好的权重 W,逐个工况重跑仿真,记录误差范数峰值和 γ_est。如果所有工况下误差都有界且 γ_est 压在设计值附近,才算真正验证了“对不确定非线性系统鲁棒”这个标题承诺。这一步最容易被跳过,但也是评审和同行最看重的部分。

6.3 进阶方向

如果控制增益 g(x) 也完全未知,IRL 样本里那个 G 项需要额外估计,可查无模型 IRL 的相关做法;如果实际控制器计算频率有限制,可以把 RLS 更新改成事件触发,只有误差超过阈值才产生新样本;如果状态测量带噪声,值函数输入不能再直接用测量值,需要先加状态观测器。这几个方向里,无模型 IRL 对工程实际最有吸引力——它连标称控制增益都不需要,彻底摆脱模型依赖。

我自己的习惯是每次调完参数,先看 W 有没有动、再看误差有没有降、最后算一次 L2 增益确认性能达标。这三条曲线比任何理论推导都诚实,它们不会骗你。积分强化学习不是开箱即用的黑匣子,但对带扰动和模型误差的非线性系统,它确实给了一条不需要精确模型就能逼近最优鲁棒控制的在线路径。希望这份最小实现和踩坑记录能帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询