简介:本资源是一份围绕不确定非线性系统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, t+T_s] 上积分,整理后得到:
[ \int_t^{t+T_s} \left( e^T Q e + u^T R u - \gamma^2 w^T w \right) d\tau + V(z(t+T_s)) - V(z(t)) = 0 ]
注意这个式子只包含状态轨迹上的累积分量和值函数的差分,不包含任何偏导数项。这就是"积分强化学习"这个名字的由来——它把对系统模型的求导运算,替换成了对实测数据的积分运算。
2.3 策略迭代与值迭代:两种收敛路径
IRL框架下有两类经典迭代算法。策略迭代的思路是:先用一个初始稳定控制律收集数据,基于数据评估当前控制策略对应的值函数V_i,然后用V_i改善控制律得到u_{i+1},重复两步直到收敛。它的优点是收敛速度快,缺点是要求初始控制律必须是稳定、能够镇定的。
值迭代的思路是:不需要初始稳定策略,直接从任意初始值函数开始,反复应用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^{t+T_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(t+T_s)) - \sigma(z(t)) \right] ]
当网络权值逼近真值时,残差δ趋近于零。我们用最小二乘准则来使残差平方和最小。在离线策略迭代阶段,一次收集N个数据点(每个点对应一个采样区间),得到线性方程组:
[ \Phi \hat{W}_c = \Psi ]
其中 Φ = ∑[σ(z(t_k)) − σ(z(t_k+T_s))]^T [σ(z(t_k)) − σ(z(t_k+T_s))],Ψ = ∑[σ(z(t_k)) − σ(z(t_k+T_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(t+1) = \hat{W}_c(t) - L(t) \left( \hat{W}_c^T(t) \Delta \sigma(t) + p(t) \right) ] [ P(t+1) = \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 有明显偏差,考验跟踪能力。
性能函数参数取 Q=10,R=1,γ=1.8。γ的取值不能太小,否则控制增益过大或难以满足博弈的情况下算法不收敛。这个参数我用试凑法确定的,从2.0逐步下调到1.8,仿真结果仍然稳定,说明还有余量。
4.2 完整可运行代码(仿真框架)
%% 基于积分强化学习的H∞跟踪控制仿真 % 系统: dx = f(x) + g(x)u + k(x)w + delta(x,t) % 标称: f=x+x^2+sin(x), g=1, k=0.5 % 不确定: delta=0.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(k+1) = 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 : k+m-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(t+T_s)) - σ(z(t)) z_k = [x(k); xd(k)]; z_kp = [x(k+m); xd(k+m)]; 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一直对称正定,但数值误差会让它逐步不对称,最后导致发散。每步做(P+P')/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的框架内都有成熟的文献可以参考,核心工具还是你在这份博文里学到的这套数据驱动学习机制。
最后分享一个我自己的调试习惯:无论理论推导多么漂亮,永远先在仿真里加一组极端工况测试——大步长参考突变、强脉冲扰动、初始状态拉远。控制器能在这些工况下还活着,才有资格上实物验证。
本文还有配套的精品资源,点击获取