双积分器最短时间问题:数学参考¶
背景¶
当加速度作为控制指令时,双积分器可以描述一维运动。该问题足够简单, 可以得到解析解,同时又包含自由终止时间、有界控制、最优控制间断和 求解后的密集验证,因此适合用于核对最优控制建模与数值实现。
本页集中说明数学模型和验证准则。如需逐步学习 Pockit API,请从 快速开始教程读起。
数学模型¶
质量为一千克的物体从目标前方一米处静止出发。位置 \(x\) 相对目标 测量,速度为 \(v\),加速度 \(u\) 的绝对值不超过 \(1\ \mathrm{m/s^2}\)。自由终止时间问题为
该问题没有状态路径约束。初始和终端状态均固定,\(t_f\) 是优化变量。
解析解¶
最短时间控制会充分使用可用加速度:先朝目标方向加速一秒,再施加 反向加速度制动至静止:
对应的状态历程为
令两段饱和控制的持续时间均为 \(\tau\)。前后两段产生的位移分别为 \(-\tau^2/2\),故总位移为 \(-\tau^2=-1\)。因此 \(\tau=1\),最优 终止时间为 \(t_f^*=2\)。
这里的单个 bang-bang 切换不是奇异弧:在两个开区间内,最优控制都 位于边界。奇异弧指南说明了二者的区别 以及 Pockit 当前的能力边界。
变量与单位¶
| 符号 | 含义 | 单位 |
|---|---|---|
| \(t\) | 时间 | s |
| \(x\) | 相对目标的位置 | m |
| \(v\) | 速度 | m/s |
| \(u\) | 加速度指令 | m/s² |
| \(t_f\) | 自由终止时间 | s |
约束与转录¶
物理控制边界为 \(\lvert u\rvert\le1\)。数值模型在配点处使用极小的 内收边界
该保护量用于吸收非线性规划求解容差,使重构后的控制仍位于物理 边界内。它只会使解析终止时间增加约 \(10^{-7}\ \mathrm{s}\),下文会 明确报告这一差异。
实现采用两个 Radau 网格区间,每个区间包含六个配点。两区间的公共
边界固定在归一化时间 \(0.5\),与解析控制的切换位置一致。Ipopt 使用
bound_relax_factor=0.0,避免求解器放宽给定的数值边界。
运行示例¶
在仓库根目录运行:
如需非交互运行并保存图片:
数值验证¶
脚本仅接受 Ipopt 成功终止;以 \(10^{-7}\) 的绝对容差检查终端位置和 速度;核对两段控制的符号;并在 10,001 个等间隔物理时刻重构加速度。
经过验证的结果为
| 指标 | 数值结果 | 解析结果 |
|---|---|---|
| 终止时间 \(t_f\) | \(2.000000100109\ \mathrm{s}\) | \(2\ \mathrm{s}\) |
| 切换时刻 | \(1.000000050055\ \mathrm{s}\) | \(1\ \mathrm{s}\) |
| 密集加速度范围 | \([-0.999999900154, 0.999999902382]\ \mathrm{m/s^2}\) | \([-1,1]\ \mathrm{m/s^2}\) |
终止时间的微小差异与已说明的 \(10^{-7}\) 配点保护量一致。密集控制 历程在整个阶段内均满足物理加速度边界,而不只是在配点处满足。

源代码¶
完整可运行示例见:
examples/double_integrator.py。