You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GEKKO中如何设置含多变量的边界约束(轨道最优控制)

GEKKO多变量复杂边界约束实现问题解答

问题背景

使用GEKKO进行微分方程组最优控制,模拟点质量绕行星运行并通过推力器控制抬升轨道,需设置最终轨道的径向位置与速度边界条件:

sqrt(x[-1]**2 + y[-1]**2) = r_final
sqrt(vx[-1]**2 + vy[-1]**2) = v_final

其中(x,y)为笛卡尔位置,(vx,vy)为速度分量,[-1]代表轨迹最后一个元素;r_final、v_final分别为目标轨道的高度和速度。

尝试通过以下代码实现约束,但不确定是否可行:

m.fix(m.sqrt(x**2 + y**2), pos=len(m.time)-1,val=r_final)
m.fix(m.sqrt(vx**2 + vy**2), pos=len(m.time)-1,val=v_final)

解答

结论:上述实现不可行

fix()、fix_final()等函数仅支持直接约束GEKKO变量(Var对象),无法约束变量的复合表达式(如m.sqrt(x**2 + y**2)返回的Expression对象),运行时会触发类型错误。

正确实现方式

使用GEKKO的Equation()函数,针对轨迹最后一个时间点的表达式构建等式约束,有两种等价写法:

方式1:直接使用平方根表达式

# 约束最终径向位置等于目标值
m.Equation(m.sqrt(x[-1]**2 + y[-1]**2) == r_final)
# 约束最终速度大小等于目标值
m.Equation(m.sqrt(vx[-1]**2 + vy[-1]**2) == v_final)

方式2:转换为平方形式(推荐,数值稳定性更好)

平方根函数可能带来非负性限制或导数计算的数值问题,可将约束等价转换为平方形式,避免使用sqrt:

# 径向位置约束的平方形式
m.Equation(x[-1]**2 + y[-1]**2 == r_final**2)
# 速度大小约束的平方形式
m.Equation(vx[-1]**2 + vy[-1]**2 == v_final**2)

原理说明

GEKKO的Equation()支持任意合法的GEKKO表达式等式约束,可直接关联多个变量的运算结果与目标值,完美适配多变量复杂边界条件的需求。而fix()系列函数仅用于固定单个变量在特定时间点的取值,无法处理复合表达式。

内容的提问来源于stack exchange,提问作者indigoblue

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 18:32:46