在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
相关产品推荐
相关产品推荐

