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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:58:28