Gekko求解简单二次问题返回明显非最优解,问题排查求助
问题分析与解决
你的代码得到(0,0)这个非最优解,核心原因有两点:
1. 变量未限制非负,求解器误判鞍点为最优解
Gekko的Var()默认允许变量取任意实数(下界为负无穷、上界为正无穷)。目标函数tlX * tlY在(0,0)处的梯度为0,求解器会将这个鞍点误判为最优解。但实际上只有当tlX和tlY同号时,才能得到正的乘积,尤其是两者均为正时,才能达到真正的最大值。
2. 平方根函数的非线性增加求解难度
m.sqrt(tlX*tlX + tlY*tlY) <= 31虽然数学上等价于tlX² + tlY² <= 31²,但平方根函数的非线性特性会干扰求解器的收敛逻辑,更容易让它停留在局部驻点。
修正后的代码
from gekko import GEKKO m = GEKKO() # 设置变量非负,同时给初始正数引导求解器方向 tlX = m.Var(lb=0, value=1) tlY = m.Var(lb=0, value=1) # 用平方替换平方根,简化非线性约束,提升求解稳定性 m.Equation(tlX*tlX + tlY*tlY <= 31**2) m.Maximize(tlX * tlY) m.solve() print("solution: ", tlX.value, tlY.value )
运行结果
EXIT: Optimal Solution Found. The final value of the objective function is 480.500000000000 [21.92031085] [21.92031085]
这个结果是理论最优解:当tlX=tlY=31/√2≈21.92时,乘积达到最大值(31²)/2=480.5。
内容的提问来源于stack exchange,提问作者Rojer Vairs
相关产品推荐
相关产品推荐

