跳转至

从最优控制问题到稀疏 NLP

Pockit 使用直接配点求解连续时间最优控制问题。直接配点属于直接转录方法: 先用有限个节点变量近似未知的状态函数和控制函数,再把动力学及其他约束写成 代数等式与不等式,最终得到可由 Ipopt 或 SciPy 求解的稀疏非线性规划(NLP)。

核心过程可以概括为

\[ \text{连续最优控制问题} \longrightarrow \text{节点多项式近似与配点缺陷} \longrightarrow \text{有限维稀疏 NLP}. \]

连续时间问题

单阶段 Bolza 型问题可写成

\[ \begin{aligned} \min_{x(\cdot),u(\cdot),t_0,t_f,s}\quad & \Phi\!\left(x(t_0),x(t_f),t_0,t_f,s\right) + \int_{t_0}^{t_f} L(x,u,t,s)\,\mathrm{d}t, \\ \text{subject to}\quad & \dot{x}(t)=f(x,u,t,s), \\ & g_L \le g(x,u,t,s) \le g_U, \\ & b_L \le b\!\left(x(t_0),x(t_f),t_0,t_f,s\right) \le b_U. \end{aligned} \]

其中 \(x(t)\) 是状态,\(u(t)\) 是控制,\(s\) 表示不随时间变化、也可由多个 阶段共享的静态参数。由于 \(x(\cdot)\)\(u(\cdot)\) 的取值属于函数空间, 原问题是一个无限维优化问题。转录以有限个变量近似这些函数,从而将其转化为 有限维问题。

时间归一化与多项式近似

Pockit 把物理时间映射到归一化阶段坐标:

\[ \tau=\frac{t-t_0}{\Delta t},\qquad \Delta t=t_f-t_0,\qquad 0\le\tau\le1. \]

于是动力学变为

\[ \frac{\mathrm{d}x}{\mathrm{d}\tau} =\Delta t\,f(x,u,t,s). \]

Pockit 将归一化阶段划分为若干网格区间,并在每个区间内用多项式近似状态和 控制。这些多项式由 Radau 或 Lobatto 节点处的取值确定。因此,原本未知的连续 轨迹改由节点值数组 \(X\)\(U\) 表示;自由阶段时间和静态参数则作为额外的 有限维变量参与优化。

之所以称为“直接”方法,是因为求解器直接优化状态和控制的节点值;它不需要 先根据 Pontryagin 极小值原理推导协态两点边值问题,再求解该边值问题。

把动力学变成缺陷方程

\(f_j=f(X_j,U_j,t_j,s)\)。对于每个状态分量,Pockit 施加如下积分型 配点缺陷:

\[ d_r=(T X)_r-\Delta t\sum_j I_{rj}f_j=0. \]

矩阵 \(T\) 将状态节点值组合成网格区间内的状态变化量,\(I\) 则对由动力学 函数在节点处的取值构造的插值多项式进行积分。也就是说,每一行都要求状态 多项式给出的变化量与动力学积分一致。选定的网格以及 Radau 或 Lobatto 基函数 均已体现在这些矩阵中。

经过转录,连续微分方程 \(\dot{x}=f(x,u,t,s)\) 被有限组缺陷方程取代。 如果动力学是非线性的,缺陷方程也是非线性代数方程。

积分形式与微分矩阵形式

直接配点也常以微分矩阵形式写成 \(D X=\Delta t F\)。Pockit 采用上面的 积分型缺陷。两种形式基于相同的配点原理,但约束行排列、端点处理和乘子 换算公式取决于具体转录形式,不能直接混用。

离散目标函数与约束

\(w_j\) 是归一化求积权重,Pockit 将 Bolza 型目标近似为

\[ F_N=\Phi+\Delta t\sum_j w_j L(X_j,U_j,t_j,s). \]

模型的其余部分则转化为有限维项或约束:

连续对象 离散 NLP 中的表示
动力学 \(\dot{x}=f\) 积分型缺陷等式 \(d_r=0\)
运行代价或积分量 加权求积和
状态和控制上下界 节点决策变量的上下界
一般路径约束 在相应节点处施加的代数上下界
端点条件 关于端点值和时间的代数约束
阶段连接或状态重置 连接阶段端点与静态参数的系统约束

把所有节点值、自由时间和静态参数收集到向量 \(z\) 中,就得到标准有限维问题:

\[ \begin{aligned} \min_z\quad & F_N(z),\\ \text{subject to}\quad & c_L\le c(z)\le c_U,\\ & z_L\le z\le z_U. \end{aligned} \]

除阶段时间和静态参数等共享量外,大多数缺陷和路径约束只依赖单个网格区间内 的变量。Pockit 以符号方式构造一阶和二阶导数时会保留这种局部结构,从而生成 NLP 求解器所需的稀疏 Jacobian 与 Hessian。

Radau 与 Lobatto 如何改变离散形式

两类节点都将 OCP 转化为 NLP,但节点位置以及相邻区间多项式的连接方式不同。

性质 Radau Lobatto
端点配置 不对称 包含区间两端点
公共网格边界 左右值可以分别表示 相邻区间共享一个值
重构函数 可在网格边界表示跳变 在整个阶段内连续
典型选择理由 事件对齐或 bang-bang 跳变 光滑的状态和控制轨迹

原始连续模型不会因节点类型而改变;改变的是有限维近似空间,以及求解器实际 处理的 NLP。网格和多项式次数的选择方法见 Radau 与 Lobatto 插值

求解器收敛意味着什么,又不意味着什么?

求解器的收敛状态只针对当前离散得到的有限维 NLP。即使求解成功,也不能仅凭 这一点断定重构轨迹就是连续问题的准确解。下面三类检查回答不同问题:

  1. NLP 收敛: 离散 KKT 条件和节点约束是否达到指定求解容差?
  2. 离散收敛: 改变网格或多项式次数后,目标函数和轨迹是否保持稳定?
  3. 连续时间验证: 在密集时间网格上(包括配点之间),动力学残差、路径约束、 端点条件和物理不变量是否满足要求?

路径约束通常只在节点处施加,高阶多项式可能在节点之间越界。因此,可信的数值 结果既要满足求解器收敛条件,也要经过网格对比和密集重构检查。具体流程见 误差检查与网格调整

一个最小的转录示例

对于双积分器

\[ \dot{x}=v,\qquad \dot{v}=u,\qquad -1\le u\le1, \]

转录会为 \(x\)\(v\)\(u\) 引入节点变量。位置缺陷要求位置变化量与速度 积分一致,速度缺陷则要求速度变化量与控制积分一致。控制限制变为控制节点的 上下界,端点条件变为代数等式,自由终止时间 \(t_f\) 则成为额外的决策变量。 最小化 \(t_f\) 后,原问题就转化为有限维稀疏 NLP。

入门教程展示该模型的完整构建和求解过程; 双积分器参考则推导其解析 bang-bang 解。 后者用于提供算例和验证基准,而非讲解通用的转录原理。