多阶段电动车生态驾驶¶
背景¶
节能车辆应根据道路条件调整速度,而不是在所有路段采用同一轨迹。本例将一公里城市路段与两公里快速路段连接起来。两个路段具有不同的限速和坡度阻力项,过渡时刻与过渡速度均为自由变量。车辆从静止出发并最终停车,在累计能耗与行程时间之间进行权衡。
使用独立阶段可以显式描述道路切换,也为路线分段、限速区、充电停车或其他离散工况提供可复用的建模模式。
问题定义¶
对于路段 \(j\in\{u,a\}\),状态由距离、速度和累计能耗代理组成,即 \(x_j=(d_j,v_j,E_j)\)。控制 \(a_j\) 为有界加速度指令。动力学为
其中,上坡城市路段取 \(g_u=0.025\),下坡快速路段取 \(g_a=-0.010\)。距离和端点条件为
道路切换处的速度和能耗连续:
路径约束为
速度单位为公里每分钟,因此两个限速分别为 36 和 90 公里每小时。事件时刻和总时域满足
目标函数为
变量与单位¶
| 符号 | 含义 | 单位 |
|---|---|---|
| \(t\) | 时间 | min |
| \(d\) | 沿路线的距离 | km |
| \(v\) | 车辆速度 | km/min |
| \(a\) | 加速度指令 | km/min\(^2\) |
| \(E\) | 累计能耗代理 | 归一化 |
| \(g_j\) | 坡度阻力加速度项 | km/min\(^2\) |
| \(t_s,t_f\) | 道路切换时刻和终止时刻 | min |
建模选择¶
城市道路和快速道路分别使用一个 Lobatto 阶段,每个阶段包含 40 个网格区间,每个区间有两个插值点。由此得到的分段线性速度和加速度轨迹能在整个区间内保持节点边界。共享静态参数在事件处连接速度、累计能耗和时间。位置在事件两侧都固定为已知路段边界,因此无需额外的位置参数。求解后,程序还会在每个阶段的 2,001 个均匀时间点上检查路径边界。
能耗状态对滚动、气动和指令消耗项进行积分。它是便于理解的归一化代理,而不是详细的电池模型。静态参数边界使事件时刻与能耗猜测在非线性优化过程中保持合理尺度。
运行示例¶
保存图片且不打开窗口:
关键实现¶
urban = system.new_phase(
["position_u", "speed_u", "energy_u"], ["acceleration_u"]
)
arterial = system.new_phase(
["position_a", "speed_a", "energy_a"], ["acceleration_a"]
)
_configure_segment(
urban, grade=0.025, speed_limit=URBAN_SPEED_LIMIT,
boundaries=([0.0, 0.0, 0.0], [DISTANCE_SWITCH, v_s, e_s]),
times=(0.0, t_s),
)
_configure_segment(
arterial, grade=-0.010, speed_limit=ARTERIAL_SPEED_LIMIT,
boundaries=([DISTANCE_SWITCH, v_s, e_s],
[DISTANCE_FINAL, 0.0, e_f]),
times=(t_s, t_f),
)
system.set_phase([urban, arterial])
system.set_objective(e_f + 0.15 * t_f)
已验证结果¶
Ipopt 成功终止,目标函数值为 \(1.05215819\)。车辆在 \(t_s=1.980266\ \mathrm{min}\) 到达道路切换点,速度恰好达到城市路段限速 \(36.000\ \mathrm{km/h}\)。完成三公里行程的时间为 \(t_f=4.456853\ \mathrm{min}\)。快速道路上的最高速度为 \(65.001\ \mathrm{km/h}\),低于其 \(90\ \mathrm{km/h}\) 限速。阶段边界两侧的速度误差小于 \(2\times10^{-6}\),密集速度和加速度检查在所列精度下没有发现路径边界超限。

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