模型预测控制
模型预测控制(model predictive control,MPC)在每个采样时刻利用模型预测未来若干步,求解一个带约束的有限时域优化问题,只执行所求序列的第一步;得到新状态或观测后,再向前滚动求解。它把输入和状态限制显式放进规划,但预测准确、优化可行与闭环稳定仍是需要分别检查的性质。
预测序列与真正执行的输入
考虑无量纲离散积分器 ,。在当前状态 ,预测两步,最小化 这是凸二次问题。交换 不改变目标和约束,且目标严格凸,所以唯一解必须满足 。代回得到 ,导数为 ,故 这里clip把数值限制在闭区间内。只执行第一步 ,下一时刻重新用新的 求解。[1]
取 ,第一轮预测输入 、预测状态 。实际执行一个负一后到达二,第二轮重新预测的输入是 ,实际下一状态变成 ,而非上一轮预测的一。没有扰动也会出现这种变化,因为每次都把新的终点放到两步以后。
本例闭环稳定性的证明
当 时,控制未超限,。当 时,控制与状态异号且幅值一,故 ,有限步内进入 。进入后几何衰减至零,说明这个特定模型和目标的闭环全局渐近稳定。
这不是任意MPC的普遍证明。若本例去掉终端项、又不增加阶段状态代价,目标只剩 ,最优输入恒为零,非零状态完全不动。更一般的设计可用终端成本、终端不变集合和可行序列移位论证递归可行性与稳定性;存在扰动时还需要相应鲁棒设计。
标量实例的Python计算
下面直接使用已证明的解析优化解,不是通用二次规划求解器。输入为有限初态和非负步数,不改输入,返回每步状态与控制;时间和返回数据空间均为 。
import math
def scalar_mpc(x0, steps):
if not math.isfinite(x0) or type(steps) is not int or steps < 0:
raise ValueError("finite initial state and nonnegative integer steps required")
x = float(x0)
states, controls = [x], []
for _ in range(steps):
u = max(-1.0, min(1.0, -x / 3.0))
x = x + u
controls.append(u)
states.append(x)
return states, controls
print(scalar_mpc(3, 4))
输出状态约为 ,前四个控制为 。变式。 从 出发,先以满幅负一到四、三,再进入几何衰减阶段;零步输入返回仅含初态的状态表。
若加上状态约束、非线性动力学或更长预测时域,解析clip不再通用。实际部署还要将估计误差、采样周期与在线求解耗时纳入模型,不能仅凭离线规划可行就断言在线闭环安全。
参考资料
- ↑ James B. Rawlings、David Q. Mayne、Moritz M. Diehl,Model Predictive Control: Theory, Computation, and Design, Second Edition,Chapter 1,有限时域优化与滚动执行;稳定性条件见Chapter 2。