Gekko不遵守变量边界限制 无法得到与Excel Solver一致的解
约束实际已生效
你输出的所有变量取值都落在了你设置的[-0.005, 0.005]边界范围内,不存在约束失效的问题。你觉得结果不符合预期,本质是求解结果和Excel Solver不一致,和约束是否生效没有直接关联。
Array定义变量的参数错误
m.Array的第二个参数是数组维度,你传入的0.004是无效参数,正确创建9个初始值为0.004、边界符合要求的变量的写法是:
yb = m.Array(m.Var, 9, value=0.004, lb=-0.005, ub=0.005)
你之前的写法无法按照预期生成变量数组,不是约束功能的问题。
和Excel Solver结果不一致的解决方案
两个工具默认的求解器配置、收敛规则不同,出现结果差异属于正常现象,可以通过以下配置对齐结果:
- 调高求解精度
Gekko默认的收敛公差比Excel Solver宽松,可手动调高精度阈值:
m.options.rtol = 1e-8 # 残差收敛公差 m.options.otol = 1e-8 # 目标函数收敛公差
- 统一初始值
非线性优化对初始值非常敏感,你可以将Gekko的变量初始值设置为和Excel Solver使用的初始值完全一致,避免落到不同的局部最优解。 - 切换求解器
Gekko默认使用IPOPT内点法求解器,你可以切换为更适合中小规模非线性优化的APOPT求解器,更接近Excel Solver的GRG非线性求解器的结果:
m.options.SOLVER = 1 # 1=APOPT, 2=BPOPT, 3=IPOPT(默认)
冗余代码提示
你代码中定义的v9变量没有加入y列表参与后续计算,可直接删除,不影响求解结果。
内容的提问来源于stack exchange,提问作者Javier Huerta
相关产品推荐
相关产品推荐

