GEKKO最优控制中如何添加方程使变量高于指定阈值
实现速度全程不低于阈值的约束方法
约束实现方式
当前代码中速度变量V的求解下界设为0,求解器为了降低阻力、减少燃油消耗(最大化最终质量),可以自由把速度降到0~100的任意区间,要强制速度全程≥100,可选择以下任意一种等效方式:
- 最简便方案:直接把
V的求解下界调整为目标阈值。将原代码中V = m.Var(value=100,lb=0,ub=240)改为V = m.Var(value=100,lb=100,ub=240)。GEKKO在动态优化模式(IMODE=6)下,变量的边界约束会自动覆盖整个仿真时域的所有节点,无需额外编写方程,求解器会自动保证每个时间步的V都不会低于100。 - 灵活可调方案:如果后续需要动态修改速度阈值,不要把阈值硬编码在变量边界里,可显式添加全局约束:
- 把原本定义但未使用的
Vmin从普通变量改为固定常量:Vmin = m.Const(value=100) - 添加约束方程:
m.Equation(V >= Vmin)
这种方式和修改变量下界的效果完全一致,后续调整速度阈值时只需要修改Vmin的取值即可,无需重新初始化速度变量。
- 把原本定义但未使用的
必须配套的可行性修正
直接添加速度约束后大概率会出现求解不可行的报错,原因是当前油门参数设置下,推力根本无法平衡100速度下的飞行阻力:
- 当V=100时,平飞阻力计算值为
D=0.5*Ro*V²*Cd*S = 67430N - 最大可用推力为
Thrmax=200000N,对应维持100速度需要的最小油门位置为Tcontr_min = D / Thrmax ≈ 0.34 - 当前代码中将油门
Tcontr的下界设为0.2,对应的最大可用推力仅为40000N,远小于维持100速度需要的最小推力,求解器无法找到满足速度约束的可行解。 - 修正方式:将
Tcontr的下界从0.2调整到0.35左右,保证最低推力可以平衡100速度下的飞行阻力:# 原代码:Tcontr = m.MV(value=0.2,lb=0.2,ub=1) Tcontr = m.MV(value=0.4,lb=0.35,ub=1)
常见误区
- 不要只在仿真终点添加
V*final >=100类约束:求解器会为了省油,在飞行过程中把速度降到极低值,只在最后时刻把速度拉回100以上,完全达不到全程保持速度的要求。 - 定义后未参与方程或边界设置的变量(如当前代码里的
Vmin)对求解过程没有任何作用,属于冗余代码。
内容的提问来源于stack exchange,提问作者Tom Blums
相关产品推荐
相关产品推荐

