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

同一非线性规划模型在GEKKO与LINGO中求解结果不一致的原因

问题描述

我正在使用Python开展优化问题求解工作,考虑到GEKKO支持非线性规划求解,故选用该库搭建模型。为校验求解结果准确性,我在LINGO中构建了完全一致的简易模型,却发现二者返回的同模型求解结果数值不匹配,对应代码如下:

GEKKO 实现代码

from gekko import GEKKO

# Initialize Model
smplmdl = GEKKO()

# Create Variables
x = smplmdl.Array(smplmdl.Var, 3, lb = 0)
a = smplmdl.Array(smplmdl.Var, 3, lb = 0)

Constant_Val = [10, 15, 20]

for i in range(3):
    smplmdl.Equation(x[i]*(sum(a[j] for j in range(3))) == Constant_Val[i])

# Objective Function
smplmdl.Obj(sum(x[i] for i in range(3)))

smplmdl.options.IMODE = 3
smplmdl.solve()
smplmdl.options.OBJFCNVAL

print('x:', x)
print('a:', a)
print(smplmdl.options.OBJFCNVAL)

LINGO 实现代码

Min = x1 + x2 + x3;

x1*(a1 + a2 + a3) = 10;
x2*(a1 + a2 + a3) = 15;
x3*(a1 + a2 + a3) = 20;
问题根因

两个模型返回结果不一致,核心原因是你搭建的模型本身不存在有限的唯一最优解,和求解器本身无关:

  • 令S = a1 + a2 + a3,根据约束可以直接推导出x1=10/S、x2=15/S、x3=20/S,目标函数可化简为45/S。
  • 你没有给a数组设置任何上界约束,S可以取无限大的正值,对应的目标函数可以无限趋近于0,属于典型的无界非线性规划问题。
  • 这类无界问题没有确定的全局最优解,GEKKO(默认调用IPOPT求解器)和LINGO的默认初始点、迭代终止逻辑、收敛容差设置都不相同,最终会停在满足各自收敛条件的不同可行点上,自然返回数值不匹配。
  • 额外说明:模型里a1/a2/a3三个变量仅以和的形式出现在约束中,三者的取值本身就有无穷多种组合,哪怕固定S的值,a的解也不唯一。
修正方案

要让两个求解器返回一致的结果,你需要先补全模型定义,消除无界、无穷多解的问题:

  • 根据实际业务逻辑给a变量补充合理的上界约束,比如限制单个a[i]的最大值,或者直接固定S的取值
  • 对齐两个求解器的配置:包括变量边界、初始值、收敛精度参数,排除配置差异带来的结果偏差
  • 如果业务上a本身就是无约束的,那这个问题本来就没有确定的最优解,求解器返回值不同是正常现象,不存在结果对错的说法。

内容的提问来源于stack exchange,提问作者Anas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:15:37