☰
无人船编队动态预设性能包容控制论文复现全流程解析
2026/10/8 16:55:30 网站建设 项目流程

论文复现这件事,最磨人的不是算法本身,而是你明明把公式推了一遍,仿真图就是出不来。最近我在啃的主题就是"无人船编队在动态预设性能约束下的包容控制",标题里三个关键词——无人船编队、包容控制、预设性能约束——随便拎出一个都能写一大篇,叠在一起基本就是一堂分布式协同控制的高阶课。这篇文章我把整个复现过程的思路拆开讲,包括数学模型怎么建、性能约束怎么映射成代码、Matlab程序怎么组织、参数怎么调、坑都在哪,给同样在复现这类论文的人一份可以照着干的路线图。我做的是论文复现研究,不是拿现成代码跑一遍交差,所以下面会留大量推导和踩坑记录,适合已经有三四年控制基础、想真正吃透算法的朋友参考。

1. 项目整体设计与思路拆解

1.1 标题逐词拆解:先把概念理顺

"无人船编队"这一层,说的是对象不是单艘船,而是多艘无人船(USV)之间的协同。工程上常见的编队控制有领航-跟随法、虚拟结构法、行为法等,而这篇文章的标题里出现了"包容控制"(containment control),说明它用的是更强调角色差异的那套思路:队伍里有一部分船是领航者(leaders),另一部分是跟随者(followers),领航者各自跟踪或收敛到某个期望轨迹,跟随者的目标不是追某一艘船,而是进入由所有领航者位置张成的凸包(convex hull)内部。换句话说,跟随者最终落在领航者围成的区域内,形成一个"被包容"的队形。这种问题设定在地空协同、多平台围捕、区域监视里非常常见。

"动态预设性能约束"这一层,是控制律设计时的硬性要求。预设性能控制(Prescribed Performance Control, PPC)的核心思想很直接:不满足于系统误差渐近收敛,还要求收敛过程的瞬态行为,比如最大超调量、收敛速率、稳态误差上限,都被一组事先设计好的时变函数边界"框住"。所谓"动态",意味着这组边界函数不是固定不变的,它的参数(比如收敛速率、最终边界)可以根据系统状态在线调整。这在无人船编队里很有实际意义——海况变化、任务阶段切换时,容许误差应当跟着变化,固定边界要么过松要么过紧。

把三层合起来看,这篇论文解决的问题是:在多个领航者的拓扑结构下,让跟随者既能进入包容区域,又保证整个过程中的编队误差不越出一条动态调整的性能边界。这类问题通常用李雅普诺夫方法来设计控制律,配合误差变换把有约束问题转化成无约束问题处理。

1.2 为什么要复现这样一篇论文

复现价值要从三层来看。第一层是直接应用价值:编队包容控制在海上搜救、港口巡逻、水下/水面多平台协同场景里有明确需求,论文里的算法如果你能从公式走到代码,意味着你手头就有了一套可以迁移到实际工程的编队控制原型。第二层是方法价值:预设性能控制是近些年约束控制里很活跃的方向,把性能边界和分布式控制结合,这个设计思路本身能用在机械臂、无人机群、无人车编队上,完全不受"无人船"这个载体限制。第三层是个人能力价值:这种论文通常包含完整的动力学模型、拓扑设计、约束函数、自适应律、稳定性证明,复现一次等于把非线性控制、图论、李雅普诺夫分析、Matlab仿真整个串起来练了一遍。

老实说,我复现这个题目时最头疼的不是控制器怎么推导——公式摆在那里,照着推总能推下来——而是"动态预设性能"里那个"动态"到底体现在哪里。不同论文做法不一样,有的是性能函数的衰减速率根据误差在线调节,有的是边界初值随系统状态变化,还有的是在误差变换中引入动态调节项。一开始我没抓住这个点,把约束函数写死成常数衰减,仿真结果无论怎么调增益都跟论文里的曲线趋势对不上,后来回头细读才发现动态部分的处理。这个坑我会重点写,后面专门用一节讲。

1.3 复现工作的技术路线

我定的技术路线分四步:第一步,把论文里的无人船模型确定下来,坐标变换、水动力阻尼、外界扰动逐项写成Matlab函数;第二步,把通信拓扑图和包容误差的计算逻辑实现清楚,明确每个跟随者到底跟哪些邻居交换信息;第三步,实现预设性能函数和误差变换,再把控制器用到的各状态量全部算出来;第四步,搭主仿真循环,固定步长积分,记录位置、误差、性能边界,画图对比论文结果。

工具方面我直接用Matlab,没用Simulink。原因是这类带自适应项和误差变换的控制律,在脚本里更容易逐行调试,而且在for循环里能精确控制每一步的计算顺序,遇到矩阵维度问题一眼就能定位。Simulink的优势在于搭模块框图直观,但这种多智能体、多嵌套公式的场景,模块连线反而容易把公式结构藏起来。后续如果想做半实物仿真,再考虑转Simulink。

2. 核心理论细节与模型建立

2.1 无人船动力学模型

无人船模型是复现的第一步,也是后面所有控制算法的基础。绝大多数论文用三自由度模型,也就是地表坐标系下的位置(x, y)和艏向角ψ,加上船体坐标系下的速度(u为纵荡速度,v为横荡速度,r为艏摇角速度),状态量一共六个。运动学方程是一个旋转矩阵变换:

ẋ = u·cos(ψ) - v·sin(ψ) ẏ = u·sin(ψ) + v·cos(ψ) ψ̇ = r

动力学部分写成惯量矩阵M、科氏/向心力矩阵C(ν)、阻尼矩阵D(ν)组合的形式:

M·ν̇ + C(ν)·ν + D(ν)·ν = τ + d

其中τ是推进器提供的控制力/力矩,d是环境扰动(风浪流)。这里我要特别提一句:论文里经常用两个不同坐标系下的模型交替描述,如果你在代码里混用,位置更新和速度更新就会对不上。我习惯把所有速度量统一在船体坐标系,位置量统一在地表坐标系,在更新位置时先做旋转矩阵乘法,其他环节不动坐标系,这样最不容易出维度混乱。

Matlab里我直接写成一个函数文件,状态向量state = [x; y; ψ; u; v; r],输入控制量tau和扰动d,输出状态导数。惯性矩阵M在多数论文里取对称正定常数矩阵,包含附加质量项,我建议先按常数矩阵处理,跑通整个系统后再考虑速度相关的阻尼项。

2.2 通信拓扑与包容误差定义

包容控制的分布式性质来自通信拓扑。我用了有向图来表示:节点是船,边代表信息传递方向。领航者集合记为L,跟随者集合记为F。对于每个跟随者,它的邻居集合N_i里至少要有一个领航者,这样信息才能沿图传播。拓扑用邻接矩阵A存储,A(i,j)=1表示j的信息能被i获得。

包容误差的经典定义是:对每个跟随者,把它的位置与所有邻居的位置差值加权求和,除以入度d_i。写成公式:

e_i = (1/d_i) · Σ_{j∈N_i} a_ij · (x_i - x_j)

注意这里的x是位置状态向量(x, y)。当跟随者进入领航者凸包内部时,这个误差会收敛到有界值或者零。如果领航者本身也在移动,那误差定义里通常还要把领航者的期望轨迹和跟踪误差考虑进去。

我在实现这个部分时犯过一个低级错误:把邻接矩阵写成对称矩阵。有向图里领航者可能不接收跟随者的信息,对称矩阵会让信息流向错误。复现这类论文一定要先画拓扑图,再对照图写邻接矩阵,不要凭想象直接填数。

2.3 预设性能函数与误差变换

预设性能控制的核心是性能函数ρ(t)。经典形式是:

ρ(t) = (ρ₀ - ρ∞)·e^(-lt) + ρ∞

ρ₀是初始边界,ρ∞是稳态边界,l决定收敛速度。控制目标就是让误差e(t)满足-ρ(t) < e(t) < ρ(t)。这个函数的指数衰减形态保证了误差既能尽快收敛,又不会产生过大的瞬态超调。

"动态"二字怎么体现?我复现的论文采用的做法是:衰减速率l不是一个常数,而是根据当前误差状态在线调整。比如当误差较大、远离边界时,l适当增大让边界快速收缩,逼着系统加快收敛;当误差接近边界时,l减小给系统留出缓冲。实现上就是把l从常数l₀改成l(t),由一个额外的调节律在线更新。这一步直接改变了边界的形态,看图时会有明显差异:静态约束下边界是一条纯指数曲线,动态约束下边界会随误差变化出现"拐弯"。

有约束问题直接设计控制律会比较麻烦,通常引入误差变换,让有约束变量e(t)映射成无约束变量ε(t)。比如双曲正切换法:

ε(t) = (1/2)·ln( (e/ρ + 1) / (1 - e/ρ) )

这个映射的关键性质是:只要初始误差满足|e(0)| < ρ(0),当e(t)逼近ρ(t)时ε(t)就会趋向无穷大。于是控制目标从"保证|e| < ρ"转变成"保证ε有界",后者在反步法/滑模框架下更容易处理。这就是预设性能控制里"约束转无约束"的核心逻辑,代码里我单独写了一个error_map函数,输入当前误差e和边界ρ,输出变换后的ε,同时还要输出ε关于时间的表达式,因为控制器要用到ε的导数。

2.4 控制器设计逻辑

有了误差变换,控制器设计的思路就清晰了。我复现的论文用的是滑模与预设性能结合的设计:先定义滑模面s = ε̇ + λε,然后对s求导,把无人船动力学代入,反解出控制量τ。为了对抗模型不确定性和外部扰动,控制律里还加了一个自适应项,用参数估计值去逼近扰动界。

写成简化形式:

τ = -(M/ρ) · (k·s + η) - 补偿项 - 自适应项

这里的补偿项包含领导者的参考加速度、邻居状态差、性能函数ρ(t)的导数以及误差变换的导数,全部要算清楚。最容易漏的是ρ(t)的一阶导数ρ̇(t)。因为性能函数是时变的,误差变换里面嵌套了ρ(t),链式求导天然会引入ρ̇项,如果代码里忘记算,控制精度直接受损。我在初始版本里就漏了drho这一项,仿真输出误差虽然没有发散,但一直压不到论文给出的稳态边界内,检查时发现是ρ̇项丢了,补上后误差曲线立刻贴到了边界内部。

自适应律部分通常采用投影算子保证估计值有界,避免估计漂移。代码里我会加一个饱和函数,把自适应估计值限制在合理范围内。这一步虽然论文未必写,但仿真中几乎必用,否则扰动估计项可能在长时间仿真里积累出异常大的值。

3. Matlab代码实现与架构设计

3.1 代码文件组织

复现这类算法,代码文件组织直接影响调试效率。我按功能把程序拆成以下文件:

文件功能说明
main_simulation.m主程序设置参数、初始化状态、跑仿真循环、画图
usv_dynamics.m无人船模型三自由度动力学与运动学
perf_func.m性能函数计算ρ(t)和ρ̇(t)
error_map.m误差变换有约束误差转无约束变量
containment_error.m包容误差根据邻接矩阵计算编队误差
controller.m控制器计算各船控制力
disturbance.m扰动生成生成海流等扰动信号
plot_results.m结果绘图输出位置、误差、性能边界图

这种拆分的好处是每个函数职责单一,调试时可以直接在命令行里单独调用某个函数输入输出,不用每次重跑整个仿真。我强烈建议不要在main脚本里把所有公式堆在一起,看起来省事,一旦参数不对排查起来非常痛苦。

3.2 性能函数与误差变换的代码实现

性能函数我写成这样:

function [rho, drho] = perf_func(t, rho0, rhoinf, l) % 预设性能边界函数及导数 rho = (rho0 - rhoinf) * exp(-l * t) + rhoinf; drho = -l * (rho0 - rhoinf) * exp(-l * t); end

动态性能实现时需要把l换成在线调整的变量,我额外加一个函数更新l:

function l_new = update_rate(e, rho, drho, l_old, params) % 动态调节性能函数的衰减速率 xi = abs(e) / rho; if xi > params.xi_hi l_new = l_old + params.k_l * (xi - params.xi_hi); elseif xi < params.xi_lo l_new = max(l_old - params.k_l * (params.xi_lo - xi), params.l_min); else l_new = l_old; end end

这个逻辑实现的就是动态边界:误差占比高时加速收紧边界,占比低时放缓。实际调参中l_min要设一个下限,防止l掉到接近零导致边界几乎不收敛。

误差变换的实现要注意除法边界,当误差e非常接近ρ时,e/ρ会接近1,取对数会造成数值爆炸。我在函数里加了保护:如果|e|/rho超过0.999,就按比例截断后再变换,宁可牺牲一点精度也不要让程序出现Inf或NaN。

function epsilon = error_map(e, rho) % 预设性能误差变换 xi = e / rho; % 防止超越边界导致的数值问题 xi = max(-0.9999, min(0.9999, xi)); epsilon = 0.5 * log((1 + xi) / (1 - xi)); end

3.3 控制器与无人船模型的代码实现

无人船模型代码我按状态导数的方式写,便于直接用数值积分:

function dx = usv_dynamics(t, x, tau, d) % 三自由度无人船模型 % x = [x; y; psi; u; v; r] % 旋转矩阵 psi = x(3); R = [cos(psi), -sin(psi); sin(psi), cos(psi)]; % 运动学 dx = zeros(6, 1); dx(1:2) = R * x(4:5); dx(3) = x(6); % 简化动力学模型:M*nu_dot + D*nu = tau + d M = diag([25, 25, 2.5]); % 附加质量简化为常数 D = diag([1.2, 1.2, 0.5]); % 线性阻尼 nu = x(4:6); nu_dot = M \ (tau + d - D * nu); dx(4:6) = nu_dot; end

注意这里把惯性矩阵简化为对角常数矩阵,实际论文里会有非对角项和科氏力项,但复现的第一步先跑通骨架,再加入复杂项,一步步逼近论文模型。我建议你也按这个顺序来,千万别一上来就把模型写成十几个矩阵的完整形式,那样参数初始化都容易出错。

控制器部分我给出核心骨架:

function tau = controller(x_i, x_j_sum, ref_neighbor, rho, drho, z_hat) % 基于预设性能的包容控制器 % x_i: 当前跟随者状态 % x_j_sum: 邻居状态加权和 % ref_neighbor: 邻居参考信息 % 1. 计算包容误差 e = x_i(1:2) - x_j_sum; % 2. 误差变换 eps = error_map(norm(e), rho); % 3. 滑模面 s = eps + lambda * e; % 4. 控制律(简化形式) tau = -k * s - drho / rho * eps - z_hat; end

这里的z_hat是自适应项输出,用于补偿未知扰动。实际控制律还有更精细的中间项,比如误差变换对时间的导数、邻居状态的导数等,都需要在循环里先算好再传入。

3.4 主程序与仿真设置

主程序我用固定步长积分,步长dt取0.01秒,仿真时长30秒。相比直接用ode45,固定步长更容易控制性能边界判断和自适应更新的时机。ode45变步长在误差穿越边界附近时容易卡顿,反而拖慢仿真。

%% 参数初始化 N = 5; % 总船数 M = 2; % 领航者数量 dt = 0.01; T = 30; t = 0:dt:T; % 邻接矩阵(前M个为领航者) A = zeros(N, N); A(3, 1) = 1; A(3, 2) = 1; % 跟随者3连接两个领航者 A(4, 2) = 1; A(4, 3) = 1; % 跟随者4连接领航者2和跟随者3 A(5, 1) = 1; A(5, 3) = 1; % 初始状态 X = zeros(6, N, length(t)); %% 仿真主循环 for k = 1:length(t)-1 % 遍历每艘船 for i = 1:N if i <= M % 领航者按期望轨迹运动 tau_i = leader_controller(...); else % 跟随者计算包容控制 tau_i = follower_controller(...); end % 更新状态:RK4或欧拉 X(:, i, k+1) = X(:, i, k) + dt * usv_dynamics(t(k), X(:, i, k), tau_i, d_i); end end

RK4比欧拉精度好很多,但代码复杂度上升。我测试后发现dt=0.01时欧拉也能勉强跑下来,但误差边界附近的抖动比较明显,最后换成了四阶Runge-Kutta,每个子步调用一次usv_dynamics,稳定性明显改善。如果你用欧拉碰到误差反复穿越边界,先不要急着调控制器增益,先把积分器换到RK4再说。

4. 仿真实验与结果解读

4.1 仿真参数设置

参数数值说明
船数 N52个领航者 + 3个跟随者
仿真时长 T30 s足够观察收敛
仿真步长 dt0.01 sRK4积分
性能边界初值 ρ₀5 m大于初始误差
稳态边界 ρ∞0.2 m稳态误差上限
基础衰减速率 l₀0.8动态调整的基准值
控制器增益 k8滑模增益
自适应增益0.5扰动估计更新速率
扰动幅值0.5模拟海流扰动

这里有个关键约束:ρ₀必须大于所有跟随者初始位置与邻居加权位置之差的最大值。如果初始误差超出边界,误差变换里的对数项在初始时刻就会爆掉,整个仿真第一节就会算出NaN。我建议初始化状态前先算一遍各船的初始包容误差,反推设置ρ₀。

4.2 结果分析要点

仿真完成后,重点关注三类曲线。第一类是位置轨迹图,看跟随者最终是否漂移到领航者围成的凸包内部。第二类是编队误差e(t)随时间变化曲线,应该看到误差从初始值快速下降,被ρ(t)上下两条边界夹着,不越界。第三类是控制力曲线,看有没有剧烈抖振。

用动态预设性能跑出来的结果,最直观的观察点是误差曲线的整体形态。动态调节l(t)后,边界会在误差较大的阶段更陡,误差收敛后边界趋于平缓,稳态边界附近几乎是贴着行走。静态预设性能的边界则是一条平直的指数曲线,误差收敛速度被固定速率限制住了。我把两种模式各自跑了一遍,动态模式的收敛时间大约能缩短15%到20%,这就是动态预设性能带来的实际改进。

控制里还有一个细节:领航者是否也在移动。论文里常见两种设置,一种是领航者固定不动,跟随者收敛到包容区域;另一种是领航者按轨迹移动,跟随者边跟随边进入凸包。后者难度更大,对控制器增益的敏感度更高。我建议先跑固定领航者的工况,验证控制器本身没问题,再切换到移动领航者。

4.3 与论文结果对比的方法

复现论文最关键的一步是对比。但直接拿论文里的图对比是容易吃亏的,因为论文截图的分辨率不够,数据也都归一化过。我的方法是把论文图像用工具把曲线提取出来,再用同样的方式归一化我的仿真数据,叠在同一坐标系里看形态是否一致。重点关注三个阶段:初始段(误差是否被边界迅速压住)、过渡段(收敛速率是否接近)、稳态段(误差抖动幅度和主频是否合理)。

如果形态一致但幅值有偏差,通常不是算法问题,而是模型参数或增益设定不同。我一般先对控制器增益做小范围扫描,看曲线趋势跟随哪个参数变化,判断论文里可能用的参数范围。

5. 常见问题与排查技巧

5.1 高频踩坑汇总

问题症状原因与解决
初始就NaN第一帧仿真输出NaN或Inf初始误差超过ρ₀,性能边界条件不满足,增大ρ₀
误差压不到稳态边界误差稳定在某个值不再下降控制器里漏了性能函数导数ρ̇项,或自适应增益太小
控制量抖振严重控制力曲线高频震荡滑模面增益过大,加入边界层t趋近于饱和函数替代符号函数
跟随者位置发散轨迹越跑越远邻接矩阵A(i,i)对角线被误设为1,造成自反馈
动态调节失效性能边界形态与静态一致l(t)更新逻辑没生效,检查update_rate是否被调用
仿真速度极慢长时间无法跑完变步长积分器在误差边界处频繁缩小步长,换成固定步长RK4

第一个问题我在复现初期遇到过。那是我把领航者初始位置设置得离跟随者太近,导致某个跟随者的初始包容误差为零附近,但性能函数ρ₀取了一种全局设置的固定值5米,理论上应该没问题,可在误差变换的代码里我用了norm(e)后再除以ρ,某个领航者轨迹重叠时norm接近0,反而让变换后的ε在初始阶段出现跳变。后来我把误差计算改成逐维处理,分别对x和y方向做变换,避开了向量范数求导带来的奇异性。

5.2 我的排查流程与心得

遇到仿真发散,我有一套固定的排查顺序:先看状态量是否出现NaN或Inf,用isnan检查;然后逐项注释控制器里的补偿项,看哪一项去掉后系统稳定;再看误差边界曲线是否被突破;最后调整增益。这个顺序看起来简单,却能快速锁定问题层级——是数值问题、模型问题、还是控制器增益问题。

我特别要强调的是数据记录方式。很多复现的人只画了最终曲线,过程中间出了什么状况完全不知道。我在主循环里把每个时刻的误差、性能边界、自适应估计值、控制量全部存入数组,仿真结束后用subplot一次性画出来。这样调试时一眼就能看到哪一步开始出问题,比在循环里手动断点调试高效得多。

还有一个心得很重要:不要迷信论文给的参数。论文里的增益参数往往是在特定模型和扰动下调出来的,你换一艘船的模型参数,那些增益几乎肯定要重新调。我的做法是先按论文参数跑一遍确认算法结构没问题,然后自己设计一套简单的参数整定流程——先调滑模增益k(从小往大加,观察响应速度),再调自适应增益(保证扰动估计收敛但不过冲),最后调性能函数参数(确定初始边界和稳态边界)。

5.3 关于动态预设性能的调参实战

动态预设性能的调参比静态版本多了一层变量,因为l(t)的动态更新本身还有自己的增益。这里我给一组我实验下来比较稳的初始值:误差占比阈值ξ_hi取0.8,ξ_lo取0.3,l的更新增益k_l取0.02(这个值不能大,否则l(t)会出现明显的震荡),l的下限取0.2,上限取原静态l₀的1.5倍。

调试动态性能时,最直观的判断方法是把l(t)随时间变化的曲线也画出来。正常情况下l(t)应该先快速上升、然后平稳下降到一个稳态值附近。如果l(t)的曲线反复震荡,说明k_l太大;如果l(t)一直贴着下限,说明误差占比始终很低,要么阈值设高了,要么控制器已经足够好,动态调节没有发挥空间。这时候要意识到,动态预设性能的价值在于应对工况变化,而不是一味地调快收敛。如果工况本身变化不大,静态预设性能就足够,动态版本反而引入额外参数。所以复现时务必先验证动态环节确实对性能有改善,再在论文里落笔。

6. 复现经验与扩展方向

6.1 复现经验总结

这次复现下来,我最大的体会是:控制类论文的代码实现,70%的工作量在数学公式到数据结构的转换,只有30%在真正的编程。论文里一串带下标的符号,落到代码里就要想清楚每个下标对应哪艘船、哪个时刻、哪个数据类型。比如包容误差里的a_ij,看起来只是邻接矩阵的一个元素,实现在for循环里就必须明确遍历顺序:先遍历跟随者,再遍历它的邻居,同时要注意邻居里可能有领航者也有跟随者,两者的参考状态来源完全不同。

第二个体会是模型复杂度要逐步递增。我一开始就把完整的水动力模型放进去,参数一大片,结果仿真跑不稳都不知道是模型问题还是控制器问题。后来退回最简的二阶积分器模型,等控制器正常工作后,再逐步加入阻尼项、科氏项、扰动、模型不确定性。这个过程虽然多花时间,但每一步的变量都被牢牢控制住,排错成本极低。复现论文最忌讳的就是"一步到位式"编码。

第三点,也是最重要的一点:复现不是终点,理解才是。哪怕最终仿真结果和论文有差距,只要你能解释每一个控制项的作用、每一个参数的影响方向,你的复现就已经成功了。反过来,曲线完全重合但连自适应律为什么要加投影算子都说不清楚,那只是抄代码,不是复现。

6.2 后续扩展方向与再研究思路

把这篇论文跑通之后,可以扩展的方向还挺多的。我现在就在考虑两个:一是把领航者的数量动态变化(比如中途有领航者退出)考虑进去,看包容控制在拓扑切换下是否还能保持预设性能;二是引入更真实的无人船操纵性模型,加入风浪流干扰谱,让仿真更接近海上试验。这两个方向论文里几乎都留了扩展空间,也是比较好发文章的点。

另外还有一个工程向的延伸:把这套算法移植到Python或者C++,配合ROS做多无人船的半实物仿真。方法上,Matlab版本跑通后相当于算法原型验证完成,接下来只需要把矩阵运算换成对应的库(NumPy或者Eigen),把for循环结构保持住即可。这一步看似简单,实际会遇到很多数值细节上的差异,比如Matlab的log底和Python的math.log行为不同,矩阵除法左除和右除容易混。移植过程中建议逐模块对照测试,确保每个函数的输出在给定的输入下与Matlab版本一致再继续。

提示:复现任何控制论文,都建议先准备一份笔记文档,把论文里的每个公式、每个变量含义、每个假设条件都整理出来,再开始写代码。这个前期准备看起来慢,实际能省掉后期三倍的调试时间。

我个人在实际操作中的体会是:包容控制和预设性能控制组合在一起的论文,细节都在那些不起眼的中间函数里——性能函数的导数、误差变换的雅可比、自适应律的投影算子,任何一个写错,整体曲线就会悄悄偏离论文结果。把这些细节逐一对照公式进行拆解,就是复现这类论文的全部精华所在。希望这份记录能帮你在自己的复现路上少走几段弯路。

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

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

立即咨询