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

Gekko完成优化求解后如何自动计算自定义表达式F1、F2的值

Gekko优化求解后直接获取自定义表达式结果的实现方案

问题场景

使用GEKKO库完成MINLP优化求解后,可直接读取决策变量x1/x2/x3/x4/y的取值,但希望无需手动代入变量值计算,直接获取预先定义的表达式F1、F2的最终结果,测试代码如下:

from gekko import GEKKO
m = GEKKO() # Initialize gekko
m.options.SOLVER=1  # APOPT is an MINLP solver

# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500', \
                    # minlp iterations with integer solution
                    'minlp_max_iter_with_int_sol 10', \
                    # treat minlp as nlp
                    'minlp_as_nlp 0', \
                    # nlp sub-problem max iterations
                    'nlp_maximum_iterations 50', \
                    # 1 = depth first, 2 = breadth first
                    'minlp_branch_method 1', \
                    # maximum deviation from whole number
                    'minlp_integer_tol 0.005', \
                    # covergence tolerance
                    'minlp_gap_tol 0.01']

# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
# Integer constraints for x3 and x4
x3 = m.Var(value=5,lb=-5,ub=5,integer=True)
x4 = m.Var(value=1,lb=-5,ub=5,integer=True)
y = m.Var(value=1,lb=-5,ub=50,integer=True)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equations([y<x3/4,y>=x3/4+1e-8])
m.Equation(x1**2+x2**2+x3**2+x4**2==40)

#Expressions
F1 = x1*x4*(x1+x2+x3)
F2 = x3 + x4/10


m.Obj(F1 + F2) # Objective
m.solve(disp=False) # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('y: ' + str(y.value))
print('Objective: ' + str(m.options.objfcnval))

实现方法

直接用GEKKO自带的m.Intermediate()包装需要输出的表达式即可,这类中间量不会作为决策变量参与求解,只会跟着迭代过程自动更新计算值,求解结束后直接就能读结果,和访问普通决策变量的方式完全一致:

  • 把原来F1、F2的定义替换成下面的写法:
# 替换原有F1、F2定义
F1 = m.Intermediate(x1*x4*(x1+x2+x3))
F2 = m.Intermediate(x3 + x4/10)
  • 求解完成后直接加两行打印代码就能拿到结果。
    注意:GEKKO中所有变量、表达式的.value属性默认返回数组格式,针对单时间点的稳态优化场景,取索引[0]即可得到标量计算结果
print('F1: ' + str(F1.value[0]))
print('F2: ' + str(F2.value[0]))

运行后可以校验,F1加F2的结果和m.options.objfcnval存储的目标函数值完全一致。
如果不想修改原有F1、F2的定义,也可以在求解完成后,把x1到x4的value[0]提取出来代入表达式计算,只是需要重复写一遍表达式,不如用Intermediate便捷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:27:18