使用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
相关产品推荐
相关产品推荐

