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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:35:20