从最优控制问题到稀疏 NLP¶
Pockit 使用直接配点求解连续时间最优控制问题。直接配点属于直接转录方法: 先用有限个节点变量近似未知的状态函数和控制函数,再把动力学及其他约束写成 代数等式与不等式,最终得到可由 Ipopt 或 SciPy 求解的稀疏非线性规划(NLP)。
核心过程可以概括为
连续时间问题¶
单阶段 Bolza 型问题可写成
其中 \(x(t)\) 是状态,\(u(t)\) 是控制,\(s\) 表示不随时间变化、也可由多个 阶段共享的静态参数。由于 \(x(\cdot)\) 与 \(u(\cdot)\) 的取值属于函数空间, 原问题是一个无限维优化问题。转录以有限个变量近似这些函数,从而将其转化为 有限维问题。
时间归一化与多项式近似¶
Pockit 把物理时间映射到归一化阶段坐标:
于是动力学变为
Pockit 将归一化阶段划分为若干网格区间,并在每个区间内用多项式近似状态和 控制。这些多项式由 Radau 或 Lobatto 节点处的取值确定。因此,原本未知的连续 轨迹改由节点值数组 \(X\)、\(U\) 表示;自由阶段时间和静态参数则作为额外的 有限维变量参与优化。
之所以称为“直接”方法,是因为求解器直接优化状态和控制的节点值;它不需要 先根据 Pontryagin 极小值原理推导协态两点边值问题,再求解该边值问题。
把动力学变成缺陷方程¶
记 \(f_j=f(X_j,U_j,t_j,s)\)。对于每个状态分量,Pockit 施加如下积分型 配点缺陷:
矩阵 \(T\) 将状态节点值组合成网格区间内的状态变化量,\(I\) 则对由动力学 函数在节点处的取值构造的插值多项式进行积分。也就是说,每一行都要求状态 多项式给出的变化量与动力学积分一致。选定的网格以及 Radau 或 Lobatto 基函数 均已体现在这些矩阵中。
经过转录,连续微分方程 \(\dot{x}=f(x,u,t,s)\) 被有限组缺陷方程取代。 如果动力学是非线性的,缺陷方程也是非线性代数方程。
积分形式与微分矩阵形式
直接配点也常以微分矩阵形式写成 \(D X=\Delta t F\)。Pockit 采用上面的 积分型缺陷。两种形式基于相同的配点原理,但约束行排列、端点处理和乘子 换算公式取决于具体转录形式,不能直接混用。
离散目标函数与约束¶
设 \(w_j\) 是归一化求积权重,Pockit 将 Bolza 型目标近似为
模型的其余部分则转化为有限维项或约束:
| 连续对象 | 离散 NLP 中的表示 |
|---|---|
| 动力学 \(\dot{x}=f\) | 积分型缺陷等式 \(d_r=0\) |
| 运行代价或积分量 | 加权求积和 |
| 状态和控制上下界 | 节点决策变量的上下界 |
| 一般路径约束 | 在相应节点处施加的代数上下界 |
| 端点条件 | 关于端点值和时间的代数约束 |
| 阶段连接或状态重置 | 连接阶段端点与静态参数的系统约束 |
把所有节点值、自由时间和静态参数收集到向量 \(z\) 中,就得到标准有限维问题:
除阶段时间和静态参数等共享量外,大多数缺陷和路径约束只依赖单个网格区间内 的变量。Pockit 以符号方式构造一阶和二阶导数时会保留这种局部结构,从而生成 NLP 求解器所需的稀疏 Jacobian 与 Hessian。
Radau 与 Lobatto 如何改变离散形式¶
两类节点都将 OCP 转化为 NLP,但节点位置以及相邻区间多项式的连接方式不同。
| 性质 | Radau | Lobatto |
|---|---|---|
| 端点配置 | 不对称 | 包含区间两端点 |
| 公共网格边界 | 左右值可以分别表示 | 相邻区间共享一个值 |
| 重构函数 | 可在网格边界表示跳变 | 在整个阶段内连续 |
| 典型选择理由 | 事件对齐或 bang-bang 跳变 | 光滑的状态和控制轨迹 |
原始连续模型不会因节点类型而改变;改变的是有限维近似空间,以及求解器实际 处理的 NLP。网格和多项式次数的选择方法见 Radau 与 Lobatto 插值。
求解器收敛意味着什么,又不意味着什么?¶
求解器的收敛状态只针对当前离散得到的有限维 NLP。即使求解成功,也不能仅凭 这一点断定重构轨迹就是连续问题的准确解。下面三类检查回答不同问题:
- NLP 收敛: 离散 KKT 条件和节点约束是否达到指定求解容差?
- 离散收敛: 改变网格或多项式次数后,目标函数和轨迹是否保持稳定?
- 连续时间验证: 在密集时间网格上(包括配点之间),动力学残差、路径约束、 端点条件和物理不变量是否满足要求?
路径约束通常只在节点处施加,高阶多项式可能在节点之间越界。因此,可信的数值 结果既要满足求解器收敛条件,也要经过网格对比和密集重构检查。具体流程见 误差检查与网格调整。
一个最小的转录示例¶
对于双积分器
转录会为 \(x\)、\(v\)、\(u\) 引入节点变量。位置缺陷要求位置变化量与速度 积分一致,速度缺陷则要求速度变化量与控制积分一致。控制限制变为控制节点的 上下界,端点条件变为代数等式,自由终止时间 \(t_f\) 则成为额外的决策变量。 最小化 \(t_f\) 后,原问题就转化为有限维稀疏 NLP。
入门教程展示该模型的完整构建和求解过程; 双积分器参考则推导其解析 bang-bang 解。 后者用于提供算例和验证基准,而非讲解通用的转录原理。