关于Gekko创建子模型、合并模型及模型间变量关联的技术咨询
Gekko子模型创建与模型合并实现方案
Gekko完全支持子模型创建与模型合并,无需复制粘贴代码就能实现你描述的将m1输出作为m2输入(将m2的外生变量转为内生变量)的需求,下面通过代码示例具体说明。
方案思路
将每个独立模型封装为可复用的函数,函数接收一个Gekko模型对象作为参数,在该模型内创建子模型的变量、方程与目标函数,并返回需要对外传递的输出变量。合并时只需创建一个主模型,依次调用子模型函数,将前一个模型的输出作为后一个模型的输入传入即可。
代码示例
1. 封装独立子模型
from gekko import GEKKO # 封装子模型m1:输入x1,输出y1 def build_m1(model): x1 = model.Var(value=0, name='x1') y1 = model.Var(value=0, name='y1') # m1的核心方程 model.Equation(y1 == x1**2 + 1) # m1的目标函数(若有) model.Obj((y1 - 5)**2) return y1 # 封装子模型m2:接收输入变量input_var(原外生varX),输出y2 def build_m2(model, input_var): y2 = model.Var(value=0, name='y2') # m2的核心方程,用input_var替代原外生varX model.Equation(y2 == input_var * 3 + 2) # m2的目标函数(若有) model.Obj((y2 - 20)**2) return y2
2. 合并模型并求解
# 创建合并后的主模型 combined_model = GEKKO() # 构建m1并获取其输出y1 m1_output = build_m1(combined_model) # 构建m2,将m1的输出作为m2的输入(原varX变为内生变量) m2_output = build_m2(combined_model, m1_output) # 求解合并后的模型 combined_model.solve(disp=False) # 输出结果 print(f"m1变量x1: {combined_model.find_steady_state().x1.value[0]:.2f}") print(f"m1输出y1(即m2的原varX): {m1_output.value[0]:.2f}") print(f"m2输出y2: {m2_output.value[0]:.2f}")
关键说明
- 子模型通过函数封装后,可独立测试:只需创建单独的Gekko模型调用函数即可验证子模型功能,例如:
# 独立测试m1 test_m1 = GEKKO() test_y1 = build_m1(test_m1) test_m1.solve(disp=False) print(f"独立测试m1的y1输出: {test_y1.value[0]:.2f}") - 合并时所有变量、方程都属于同一个主模型,原m2的
varX因绑定到m1的输出变量y1,自动转为内生变量,参与整体优化求解。
内容的提问来源于stack exchange,提问作者danpin
相关产品推荐
相关产品推荐

