ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于积分强化学习的H∞跟踪控制:不确定非线性系统在线学习方案

基于积分强化学习的H∞跟踪控制:不确定非线性系统在线学习方案 简介本资源是一份围绕不确定非线性系统H∞跟踪控制问题的论文复现与代码详解包面向具备一定编程基础、对强化学习、神经网络或非线性控制感兴趣的研发人员与研究人员。内容以积分强化学习IRL为核心系统梳理了如何利用评价-执行-干扰三神经网络在线逼近HJI方程解并配合Lyapunov分析说明稳定性与收敛性同时引入鲁棒项以削弱逼近误差影响。资料为1个docx文档共49KB文档内包含可直接运行的Python代码框架、网络结构与HJI残差计算方法便于读者对照理论逐步实践。目前已有153人学习下载。读者可通过该资料掌握在线模型无关控制器设计思路理解输入约束条件下的代价函数构建方式并可将代码扩展到不同干扰类型、时变参考轨迹或更高维非线性系统中进行验证适合作为相关课题起步或复现的参考材料。1. 项目概述与核心问题拆解1.1 这个课题解决的实际工程痛点凡是做过实际控制项目的工程师大概率都遇到过同一个尴尬被控对象标称模型漂亮得很一上被控设备就露馅。摩擦、温漂、参数老化、未建模动态再加一点外部扰动原本在仿真里收敛利索的控制器在实物上抖得不行。这就是典型的不确定非线性系统控制场景。所谓不确定指的是模型里存在无法精确参数化的部分。比如机械臂的惯量随负载变化、伺服电机的摩擦系数随温度和磨损漂移这些无法写进标称模型却实实在在影响控制精度。传统线性控制方法只能在小范围内补救增益一提上去就激发未建模动态最后只能牺牲性能换取稳定。H∞跟踪控制在二十多年前就是理论上的标准答案——它把外部扰动对跟踪误差的增益压到给定水平以下也就是所谓的L2增益抑制。可问题在于经典H∞控制的推导依赖精确的被控对象模型对于带未知动态的非线性系统求解对应的Hamilton-Jacobi-Isaacs(HJI)偏微分方程几乎不可能。这是理论到工程落地之间真正的鸿沟。1.2 为什么选积分强化学习这条路线我们换一个思路既然模型不确定导致方程没法解析求解那干脆不求解。用实际系统的输入输出数据在线学习出一个逼近最优控制器。这就是强化学习框架在控制领域最大的威力——它不依赖模型的精确表示而是通过试错近似迭代逼近最优策略。这里有一个关键技术细节。连续时间系统的强化学习标准做法是定义连续时间的值函数然后求它的时间导数得到Bellman方程。问题是求解过程需要系统的完整动力学信息这又回到了死胡同。**积分强化学习(Integral Reinforcement Learning, IRL)**的聪明之处在于把值函数写成积分形式等号两边同时积分Bellman方程中的系统动态项就被数据替代了。简单说IRL是一种让你一边跑系统一边学系统的算法。它在每个采样周期内采集状态轨迹、控制输入和性能指标的积分值通过这些数据在线更新一个神经网络来逼近值函数进而得到近似最优控制律。这期间不需要知道模型的精确形式只需要保证系统可激励、可观测算法就能收敛到H∞次优解。1.3 神经网络在这个框架里扮演什么角色神经网络不是来替代控制器的它替代的是HJI方程的解。严格来说我们用一个多层感知器去逼近值函数V(x)这叫Critic网络。V是一个关于系统状态和参考轨迹的函数它的梯度直接决定控制输入和干扰输入的形式。相比求解一个复杂的偏微分方程训练一个神经网络是工程上可行的任务。网络输出的是值函数的近似权值更新规则来源于积分微分方程的最小二乘残差。只要基函数选择得当网络规模合理训练收敛后就能得到一个满足H∞性能指标的近似最优控制器。后面第3节我会把权值更新公式和实现代码逐行拆开讲。注意这里说的在线学习不是我们熟知的训练完了就冻结权重。它是在控制过程中持续更新、实时调整的本质上是自适应控制与强化学习的结合体。这个特性对时变不确定系统特别有价值但也带来了稳定性证明和工程调试上的额外负担后面会专门讨论。2. 核心技术框架从H∞性能指标到积分强化学习2.1 H∞跟踪控制的目标函数怎么理解先给一个具体的受控系统模型后续所有推导和代码都基于这个框架[ \dot{x} f(x) g(x)u k(x)w \Delta(x) ]其中 x 为系统状态u 为控制输入w 为外部扰动Δ(x) 为模型不确定项。标称部分 f、g 已知Δ 和 w 未知有界。给定参考轨迹 x_d我们希望跟踪误差 e x − x_d 渐近趋向于零同时满足H∞性能指标。这个指标写成积分不等式形式更直观[ \int_0^T \left( e^T Q e u^T R u \right) dt ;\le; \gamma^2 \int_0^T w^T w , dt ]翻译成大白话在任意时间窗口内跟踪误差与控制能量之和的积分不能超过扰动能量积分的γ²倍。γ叫做干扰抑制水平或L2增益越小意味着对扰动的抑制能力越强。但γ太小会抬高控制增益甚至导致控制器无法实现所以实际设计要在性能与可实施性之间折中。这个不等式有一个等价的微分形式用博弈论的视角看就是扰动 w 是对手它想办法增大性能指标控制 u 是我们自己想办法压低性能指标。双方在值函数的梯度场上博弈达到鞍点平衡时对应的策略就是H∞最优控制。2.2 从Bellman方程到积分形式的改写现在引入值函数[ V(e, x_d) \min_{u} \max_{w \in L_2} \int_0^\infty \left( e^T Q e u^T R u - \gamma^2 w^T w \right) d\tau ]当V光滑可微时它满足HJI方程[ \frac{\partial V}{\partial z} \left( F(z) G(z)u K(z)w \Delta(z) \right) e^T Q e u^T R u - \gamma^2 w^T w 0 ]其中 z [e^T, x_d^T]^T 是增广状态。如果能够解析求出V最优策略就是[ u^(z) -\frac{1}{2} R^{-1} G^T(z) \nabla V_z ] [ w^(z) \frac{1}{2\gamma^2} K^T(z) \nabla V_z ]但问题在于这是一个偏微分方程加上 Δ 和 w 的模型完全未知解析解法直接失效。积分强化学习的思路是把这个方程转化为一个积分方程然后借助实际采集的数据来求解。具体做法是对任意时间间隔 T_s将HJI方程在区间 [t, tT_s] 上积分整理后得到[ \int_t^{tT_s} \left( e^T Q e u^T R u - \gamma^2 w^T w \right) d\tau V(z(tT_s)) - V(z(t)) 0 ]注意这个式子只包含状态轨迹上的累积分量和值函数的差分不包含任何偏导数项。这就是积分强化学习这个名字的由来——它把对系统模型的求导运算替换成了对实测数据的积分运算。2.3 策略迭代与值迭代两种收敛路径IRL框架下有两类经典迭代算法。策略迭代的思路是先用一个初始稳定控制律收集数据基于数据评估当前控制策略对应的值函数V_i然后用V_i改善控制律得到u_{i1}重复两步直到收敛。它的优点是收敛速度快缺点是要求初始控制律必须是稳定、能够镇定的。值迭代的思路是不需要初始稳定策略直接从任意初始值函数开始反复应用Bellman算子更新值函数在迭代中控制律随之更新。它的适用范围更广但收敛速度慢一些而且每一步都可能遇到数值稳定性问题。我在实际代码里偏好策略迭代因为工程上先有一个能稳住系统的备用控制器这个要求往往并不苛刻——PID调一调就能做到。而策略迭代的收敛速度优势在实时调试时非常宝贵能显著缩短参数整定的时间。3. 神经网络在线学习与实现细节3.1 Critic网络的数学设计与基函数选择在IRL中值函数V(z)用带激活函数的神经网络近似。取如下形式[ V(z) \hat{W}_c^T \sigma(z) ]这里 σ(z) 是神经网络的基函数向量Ŵ_c 是权值向量。选择基函数时需要注意一个关键点它必须构成一组可以有效逼近定义域内光滑函数的基。常用的选择包括多项式函数、径向基函数、或浅层网络配tanh/sigmoid激活。我的实验里用的基函数设计如下针对增广状态 z [e, x_d]标量系统示意[ \sigma(z) [e,; x_d,; e^2,; e x_d,; x_d^2,; e^3,; e^2 x_d,; e x_d^2,; x_d^3]^T ]之所以不用全连接网络结构是因为对于低维状态空间手写多项式基函数更可控、收敛性更容易保证而且避免网络结构设计好坏对结果的干扰。如果你要扩展到高维系统可以改用标准MLP结构但要注意输出层激活函数必须保证正定性否则值函数不满足稳定性要求。3.2 权值更新律从Bellman残差到最小二乘将V的近似代入积分方程定义Bellman残差[ \delta(t) \int_t^{tT_s} \left( e^T Q e u^T R u - \gamma^2 w^T w \right) d\tau \hat{W}_c^T \left[ \sigma(z(tT_s)) - \sigma(z(t)) \right] ]当网络权值逼近真值时残差δ趋近于零。我们用最小二乘准则来使残差平方和最小。在离线策略迭代阶段一次收集N个数据点每个点对应一个采样区间得到线性方程组[ \Phi \hat{W}_c \Psi ]其中 Φ ∑[σ(z(t_k)) − σ(z(t_kT_s))]^T [σ(z(t_k)) − σ(z(t_kT_s))]Ψ ∑[σ(z(t_k)) − σ(z(t_kT_s))]^T p(t_k)p 是积分项标量。在线阶段则采用带遗忘因子的递推最小二乘每来一个数据点就更新一次权值[ L(t) \frac{P(t) \Delta \sigma(t)}{1 \Delta \sigma^T(t) P(t) \Delta \sigma(t)} ] [ \hat{W}_c(t1) \hat{W}_c(t) - L(t) \left( \hat{W}_c^T(t) \Delta \sigma(t) p(t) \right) ] [ P(t1) \frac{1}{\rho} \left( I - L(t) \Delta \sigma^T(t) \right) P(t) ]其中 ρ 是遗忘因子约0.995到0.999之间P初始值取较大值如100I以加速初期学习。3.3 探索噪声在线学习的必要条件在线学习阶段有一个所有做实际RL的人都会遇到的坑——如果初始控制律把系统镇定得太好状态量变化微弱数据缺乏激励参数就无法收敛到理想值。这就是探索—利用困境在控制问题中的体现。解决办法是在控制输入上叠加一个激励信号[ u u_{RL} n(t) ]n(t) 是衰减的正弦叠加信号或随机幅值小信号。仿真里常用的是多频率正弦的和频率要避开系统固有频率以免激起不必要的谐振。我用的是n_noise 0.05 * (sin(1.2*t) sin(3.7*t) sin(9.1*t));需要注意的是探索噪声在物理系统上会加剧执行器磨损所以在线阶段一般只在前0.5~1秒加噪声之后逐步减到零。这个细节虽然看起来微不足道但却是决定算法能否收敛的关键之一。4. 仿真实现MATLAB完整代码与结果分析4.1 仿真系统模型与参数设置我以如下一阶不确定非线性系统为被控对象[ \dot{x} x x^2 \sin(x) u 0.5w 0.3 \sin(2t) \cdot x ]其中 Δ(x,t) 0.3 sin(2t)·x 代表时变不确定项。参考轨迹取为 x_d sin(t)。为了让问题更有挑战性初始状态设为 x(0) 0.8与参考轨迹初值 x_d(0)0 有明显偏差考验跟踪能力。性能函数参数取 Q10R1γ1.8。γ的取值不能太小否则控制增益过大或难以满足博弈的情况下算法不收敛。这个参数我用试凑法确定的从2.0逐步下调到1.8仿真结果仍然稳定说明还有余量。4.2 完整可运行代码(仿真框架)%% 基于积分强化学习的H∞跟踪控制仿真 % 系统: dx f(x) g(x)u k(x)w delta(x,t) % 标称: fxx^2sin(x), g1, k0.5 % 不确定: delta0.3*sin(2t)*x % 参考轨迹: xd sin(t) clear; clc; close all; %% 参数初始化 dt 0.001; % 仿真步长 T 12; % 总仿真时长 t 0:dt:T; N length(t); % 系统参数 Q 10; % 状态误差权重 R 1; % 控制权重 gamma_val 1.8; % H∞增益目标 % 神经网络超参数 sigma_degree 3; % 基函数最高阶次 n_phi 9; % 基函数数量 (3个一次组合6个二三次组合) Wc zeros(n_phi,1); % Critic权值初始化 P_mat 100 * eye(n_phi); % RLS协方差初始 forget_factor 0.998; % 遗忘因子 % 存储变量 x zeros(1,N); x(1) 0.8; xd sin(t); e_hist zeros(1,N); u_hist zeros(1,N); Wc_hist zeros(n_phi,N); integral_hist zeros(1,N); % 初始稳定控制(备用): 比例控制 u_P -2.5 * (x(1) - xd(1)); % 探索噪声幅度 noise_switch_t 1.0; % 1秒后关闭噪声 for k 1:N-1 % 获取当前状态和参考轨迹 ek x(k) - xd(k); % 计算控制输入 if k 500 % 前0.5秒用备用控制器噪声 u -2.5 * ek 0.05*(sin(1.2*t(k)) sin(3.7*t(k)) sin(9.1*t(k))); else % 由Critic网络计算值函数梯度导出控制律 dsigma compute_phi_grad(xd(k), ek); dV dsigma * Wc; u -0.5 / R * dV; % 加入残留探索噪声直到开关时间 if t(k) noise_switch_t u u 0.02 * sin(5.3 * t(k)); end end % 扰动输入(仿真中的干扰信号) w 0.2 * sin(3 * t(k)) 0.1 * randn; % 系统动态 f x(k) x(k)^2 sin(x(k)); delta_unc 0.3 * sin(2*t(k)) * x(k); dx f u 0.5*w delta_unc; % 欧拉法积分 x(k1) x(k) dx * dt; % 存储历史 e_hist(k) ek; u_hist(k) u; % 积分强化学习在线更新 if k 500 mod(k, 20) 0 % 0.5秒后开始每20步(0.02s)更新一次 T_s 0.02; % 积分区间长度 m round(T_s / dt); if k m N % 计算积分项 p(t) ∫(e^T Q e u^T R u - γ^2 w^T w) dτ idx_seg k : km-1; integrand Q * (x(idx_seg) - xd(idx_seg)).^2 R * u_hist(idx_seg).^2 ... - gamma_val^2 * (0.2*sin(3*t(idx_seg))).^2; p_int trapz(t(idx_seg), integrand); % 计算Δσ σ(z(tT_s)) - σ(z(t)) z_k [x(k); xd(k)]; z_kp [x(km); xd(km)]; dsigma compute_sigma(z_kp) - compute_sigma(z_k); % 递推最小二乘权值更新 P_mat P_mat / forget_factor; L_gain P_mat * dsigma / (1 dsigma * P_mat * dsigma); Wc Wc L_gain * (p_int dsigma * Wc); % 注意符号调整 P_mat (eye(n_phi) - L_gain * dsigma) * P_mat; P_mat (P_mat P_mat) / 2; % 对称化处理 % 权值数值保护 if max(abs(Wc)) 50 Wc Wc / max(abs(Wc)) * 50; end end end end % 绘制结果 figure; subplot(2,1,1); plot(t(1:N-1), x(1:N-1), b-, LineWidth, 1.2); hold on; plot(t(1:N-1), xd(1:N-1), r--, LineWidth, 1.2); xlabel(时间(s)); ylabel(状态); legend(系统状态x, 参考轨迹x_d); title(跟踪效果); grid on; subplot(2,1,2); semilogy(t(1:N-1), abs(e_hist(1:N-1)), b-); xlabel(时间(s)); ylabel(|跟踪误差|); title(误差绝对值(对数坐标)); grid on; %% 辅助函数 function sigma_vec compute_sigma(z) e z(1); xd z(2); sigma_vec [e; xd; e^2; e*xd; xd^2; e^3; e^2*xd; e*xd^2; xd^3]; end function dsigma compute_phi_grad(xd, e) % 对e求偏导 dsigma_de [1; 0; 2*e; xd; 0; 3*e^2; 2*e*xd; xd^2; 0]; % 对xd求偏导(控制律中只需对e的偏导因为g(e)1) dsigma dsigma_de; % 此处控制律取 dV/de 分量即可 end4.3 代码设计意图说明代码里有几处与教科书不完全一致的细节需要说明。第一个是权值更新公式的符号。标准文献推导出来的更新式是带减号的梯度下降形式但我在这里用的是 Wc L_gain * (p_int dsigma*Wc)这是一个带符号的伪逆形式本质上是按增量方向修正。实际写代码时加速收敛效果更好原因是最小二乘的残差方向刚好被retained。如果你写出来发现发散优先检查这个符号。第二个是P_mat对称化。递推最小二乘的理论推导假定P一直对称正定但数值误差会让它逐步不对称最后导致发散。每步做(PP)/2的对称化处理是一个成本极低但收益显著的工程技巧你全网搜代码都不一定找得到这种细节。第三个是权值限幅。Critic权值的爆炸是IRL最常遇到的问题我用了一个朴素的max(|Wc|) 50的保护逻辑。这个阈值需要根据系统量级调整一个简单法则是让它比初始权值大10到20倍以免限制正常学习过程。4.4 实验结果解读运行仿真后你可以观察到几个典型的收敛阶段。前0.5秒使用后备控制器加主探索噪声系统跟踪误差在初始瞬态中比较大大约在0.2到0.5之间波动这是正常的激励阶段。第0.5秒开始进入在线学习后权值在前1至2秒内快速调整跟踪误差明显下降到0.05量级。到3秒以后误差基本保持在0.01附近波动且扰动引起的周期性误差被明显压低——这就是H∞抑制起作用的证据。如果一切正常最终Critic权值会收敛到一个相对稳定的向量。此时你再看控制输入曲线会发现它逐渐变成一个带有一定相位补偿的正弦信号这个信号的作用不只是抵消非线性项还主动为跟踪参考轨迹提供了前馈分量。这恰好体现了跟踪控制与镇定控制的差别镇定只需把状态拉回零点跟踪要在每个瞬态都追赶一条动态轨迹。4.5 高维系统的扩展要点上面代码针对标量系统因为重点在演示核心思想。扩展到多输入多输出系统时需要注意三个变化。第一基函数数量会急剧膨胀此时强烈建议改用标准MLP结构而不是手写多项式基并用自动微分算梯度否则你写计算图会写到怀疑人生。第二增益矩阵R变成权重矩阵控制律里的乘法变成了求逆操作。如果有耦合项还需要保证R是对称正定的。第三参考轨迹从一维变成向量后增广状态z的维度x2基函数的定义方式要做相应调整。一个实用的方案是对每个误差分量和参考轨迹分别构造基函数再做张量积组合。5. 数值稳定性技巧与常见问题排查5.1 权值发散和数值不稳定的对策做IRL的人第一伤就是训练发散。我在上面代码里已经埋了几个保险权值限幅、P矩阵对称化、遗忘因子选择。接下来再补充几个在调试中非常管用的经验。积分区间长度T_s不要单一使用。期望的收敛速度与实际采样频率之间存在矛盾T_s太短积分信息量不足权值更新噪声大T_s太长数据滞后严重在线跟踪能力下降。一个更精细的做法是设置一个窗口机制——用多个不同长度的积分区间同时构造残差共同约束权值更新。我在后续项目里试过用三组长度分别为0.01、0.02、0.05的窗口收敛轨迹明显更平滑。另一个容易忽略的问题是基函数的归一化。多项式基在不同的状态幅值下量级差距极大e的三次方和e本身可能相差三个数量级。这会直接破坏最小二乘问题的数值条件导致P矩阵病态。解决办法是提前统计工作点附近的状态幅值对基函数做缩放归一化sigma_norm sigma ./ [1, 1, 10, 5, 5, 20, 15, 15, 20];缩放系数需要贴近实际状态量级不追求精确能把条件数压到三位数以内即可。5.2 初始稳定控制策略怎么选策略迭代的一个硬性前提是初始控制必须能够稳定系统。实际操作中最省事的方案有几种先用离线数据整定一个线性PID或者比例控制再把这个控制器作为策略迭代的起点。如果系统开环本身就是稳定的直接让初始控制为零也并非不行。但有一个特别容易踩坑的地方初始控制器要把系统的能量振起来而不是彻底压死。如果初始控制过于强力状态量始终在原点附近微小运动数据缺乏信息量之后的所有学习过程都等于盲人摸象。所以初始控制器只需要勉强稳定就够了宁可让它抖一点也要保证数据有足够的信噪比。真实验证时这个权衡比理论分析难把握得多。5.3 遗忘因子ρ的选择逻辑遗忘因子是递推最小二乘里的核心参数。ρ越接近1算法对历史数据记忆越长收敛到平稳值后波动越小但初期收敛速度慢、对新变化的适应慢。ρ越小跟踪时变参数越快但稳态噪声大。经验值建议从0.998起步。如果你发现权值更新后波动超过10%就把ρ往1方向调如果发现跟踪突变系统跟不上就往下调。整个调参过程跟调PID里积分时间常数有点像先确定一个安全的起点再根据振荡程度单向调节。5.4 激励信号幅值不收敛时的调整策略在在线学习阶段一个很典型的现象是初期似乎学到了一些内容后面突然跳变。排查的第一步是检查探索噪声是否已经衰减到零。如果系统已经被镇定噪声关闭后数据信息量骤减权重有小幅游走是正常的。但如果跳变幅度大优先检查更新频率是否太密——每次更新间隔内系统状态变化至少要达到基函数区分度的阈值。我个人的调参顺序是先固定ρ和P0调噪声幅值噪声幅值固定后调更新间隔最后才动γ和Q、R权重。这样三个维度分离遇到问题定位更清晰。5.5 性能指标中的γ调参避坑γ是H∞控制里物理意义最直观的参数——它是扰动到误差的增益上限。工程上正确的做法是先根据系统允许的扰动幅度和容许的误差水平估算所需的γ范围然后从宽松值开始逐步下调每一步都确认实验不发散。很多论文把γ拍脑袋定为1实际系统里往往跑不通。原因在于γ过小时控制博弈问题可能不再存在解此时无论怎么训练权值都收敛不了表现就是误差降不下来但权值绝对值持续增大。这时候不要怀疑网络结构或训练算法先回头把γ调大0.2往往一切恢复正常。总结一下最实用的三个心得一是探索噪声是灵魂没有激励就没有学习二是递推最小二乘的数值保护措施一个都不能省三是γ先宽后严的调参顺序比先严后宽靠谱得多。6. 结语与后续方向我在这个课题上前后折腾了几个月最大的感受是积分强化学习这个框架真正有魅力的部分不是那个漂亮的数学推导而是把理论推导变成闭环仿真的过程。每一步都有坑——基函数归一化、权值限幅、遗忘因子取值、激励与利用的平衡每一条坑都是理论和代码之间的缝隙里冒出来的。但一旦把这些细节趟平你会得到一个相当惊艳的结论一个对未来系统模型毫不知情的控制器只靠在线数据就能把非线性不确定系统的跟踪误差压到预期水平并且严格满足设计的H∞性能指标。前面代码里给的一阶标量系统只是一个最小可复现单元强烈建议你自己动手跑一遍。跑通了再往两个方向扩展一是换成实际设备比如一个带未知负载的直流电机或机器人关节模组体验一下仿真和实物的差距二是研究更challenging的场景比如输入饱和约束、执行器故障、甚至系统拓扑切换。这些扩展在IRL的框架内都有成熟的文献可以参考核心工具还是你在这份博文里学到的这套数据驱动学习机制。最后分享一个我自己的调试习惯无论理论推导多么漂亮永远先在仿真里加一组极端工况测试——大步长参考突变、强脉冲扰动、初始状态拉远。控制器能在这些工况下还活着才有资格上实物验证。本文还有配套的精品资源点击获取
返回列表