GEKKO求解简单模型失败的原因探究
GEKKO求解失败原因分析与修正方案
错误原因
GEKKO的NLP求解器仅支持实数域运算,你的模型中z = -5,计算z ** 0.5时会得到复数,这超出了求解器的处理范围,直接触发Invalid number in NLP function or derivative detected错误,导致求解终止。
修正方案
你预期的最优解用到了复数,但GEKKO无法处理复数优化问题,需将模型调整到实数范围内:
情况1:笔误导致y为负数
如果是不小心把y设成-5,改为正数即可正常求解:
from gekko import GEKKO m = GEKKO() x = m.Var(value=15.0, lb=10.0, ub=20.0, name="x") y = m.Intermediate(5.0, name="y") # 修正为正数 z = m.Intermediate(y, name="z") r = m.Intermediate(200000.0 * z ** 0.5, name="r") obj_expr = r - x m.Maximize(obj_expr) m.options.MAX_ITER = 10000 m.solve() # 输出结果 print(f"x最优值: {x.value[0]}") print(f"r值: {r.value[0]}") print(f"目标函数最大值: {obj_expr.value[0]}")
此时求解器会自动将x取下界10,符合你对最优解的逻辑预期。
情况2:确实需要基于负数计算平方根(实数范围内)
如果逻辑上需要对负数的绝对值开平方,使用GEKKO内置的m.abs()函数确保运算在实数域内:
from gekko import GEKKO m = GEKKO() x = m.Var(value=15.0, lb=10.0, ub=20.0, name="x") y = m.Intermediate(-5.0, name="y") z = m.Intermediate(y, name="z") r = m.Intermediate(200000.0 * m.abs(z)**0.5, name="r") # 取绝对值后开平方 obj_expr = r - x m.Maximize(obj_expr) m.options.MAX_ITER = 10000 m.solve() # 输出结果 print(f"x最优值: {x.value[0]}") print(f"r值: {r.value[0]}") print(f"目标函数最大值: {obj_expr.value[0]}")
总结
GEKKO的优化求解器仅支持实数运算,所有表达式的计算结果必须落在实数范围内,才能避免无效数值错误并完成求解。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

