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

关于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 04:10:25