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

使用m.Connection()加载结果时出现'v1 not found in results file'错误求助

Gekko Connection() 加载结果时出现 KeyError: 'v1' 的解决办法

问题描述

使用m.Connection()简化模型(减少变量数量)时,模型能完成仿真求解,但加载结果时抛出KeyError: 'v1'错误。可通过以下代码复现:

from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
m.time = np.linspace(0,20,100)

u = m.MV()
x = m.SV()
y = m.SV()
z = m.SV()

m.Equations([
    x.dt() == x + u,
    y == 2*z - 0.1*u
])
m.Connection(z, x)

m.options.IMODE = 4
m.solve()

错误栈核心为:

KeyError: 'v1'

原因分析

m.Connection(z, x)的作用是让z和x共享同一变量,但z被定义为SV()(状态变量)。求解完成后,结果文件中不会单独存储z的数值(因为与x完全同步),但Gekko在加载结果时仍尝试读取z的相关字段(如v1),导致找不到对应键值抛出错误。

解决办法

方案1:直接引用变量替代Connection(推荐)

不要将z定义为独立的SV(),直接让z成为x的引用,这样既达到简化模型的目的,又避免加载结果时的冲突:

from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
m.time = np.linspace(0,20,100)

u = m.MV()
x = m.SV()
y = m.SV()
z = x  # 直接引用x,替代m.Connection(z, x)

m.Equations([
    x.dt() == x + u,
    y == 2*z - 0.1*u
])

m.options.IMODE = 4
m.solve()

方案2:调整变量类型

如果必须使用m.Connection(),可以将z改为普通变量m.Var()而非SV(),但这种方式不如方案1简洁:

from gekko import GEKKO
import numpy as np

m = GEKKO(remote=False)
m.time = np.linspace(0,20,100)

u = m.MV()
x = m.SV()
y = m.SV()
z = m.Var()  # 改为普通变量

m.Equations([
    x.dt() == x + u,
    y == 2*z - 0.1*u
])
m.Connection(z, x)

m.options.IMODE = 4
m.solve()

说明

方案1中z作为x的别名,不会被Gekko视为独立变量,结果文件中不会为z生成条目,加载时自然不会出现找不到字段的问题,完全符合简化模型、减少变量数量的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:05:21