跳转至

双积分器最短时间问题:数学参考

背景

当加速度作为控制指令时,双积分器可以描述一维运动。该问题足够简单, 可以得到解析解,同时又包含自由终止时间、有界控制、最优控制间断和 求解后的密集验证,因此适合用于核对最优控制建模与数值实现。

本页集中说明数学模型和验证准则。如需逐步学习 Pockit API,请从 快速开始教程读起。

数学模型

质量为一千克的物体从目标前方一米处静止出发。位置 \(x\) 相对目标 测量,速度为 \(v\),加速度 \(u\) 的绝对值不超过 \(1\ \mathrm{m/s^2}\)。自由终止时间问题为

\[ \begin{aligned} \min_{x,v,u,t_f}\quad & J=t_f=\int_0^{t_f}1\,\mathrm dt,\\ \text{约束}\quad & \dot x=v,\qquad \dot v=u,\\ & x(0)=1,\qquad v(0)=0,\\ & x(t_f)=0,\qquad v(t_f)=0,\\ & -1\le u(t)\le1. \end{aligned} \]

该问题没有状态路径约束。初始和终端状态均固定,\(t_f\) 是优化变量。

解析解

最短时间控制会充分使用可用加速度:先朝目标方向加速一秒,再施加 反向加速度制动至静止:

\[ u^*(t)= \begin{cases} -1, & 0\le t<1,\\ +1, & 1<t\le2. \end{cases} \]

对应的状态历程为

\[ (x^*(t),v^*(t))= \begin{cases} \left(1-\frac12t^2,-t\right), & 0\le t\le1,\\[4pt] \left(\frac12(2-t)^2,t-2\right), & 1\le t\le2. \end{cases} \]

令两段饱和控制的持续时间均为 \(\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\)。数值模型在配点处使用极小的 内收边界

\[ \lvert u\rvert\le1-10^{-7}. \]

该保护量用于吸收非线性规划求解容差,使重构后的控制仍位于物理 边界内。它只会使解析终止时间增加约 \(10^{-7}\ \mathrm{s}\),下文会 明确报告这一差异。

实现采用两个 Radau 网格区间,每个区间包含六个配点。两区间的公共 边界固定在归一化时间 \(0.5\),与解析控制的切换位置一致。Ipopt 使用 bound_relax_factor=0.0,避免求解器放宽给定的数值边界。

运行示例

在仓库根目录运行:

python -m examples.double_integrator

如需非交互运行并保存图片:

python -m examples.double_integrator --save double-integrator.png --no-show

数值验证

脚本仅接受 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}\) 配点保护量一致。密集控制 历程在整个阶段内均满足物理加速度边界,而不只是在配点处满足。

双积分器最短时间问题的位置、速度和 bang-bang 加速度

源代码

完整可运行示例见: examples/double_integrator.py