【问题标题】:Invalid element errror within intermediate structure in GEKKOGEKKO 中的中间结构中的无效元素错误
【发布时间】:2026-01-06 08:50:01
【问题描述】:

我正在尝试解决 Python GEKKO 中的 MINLP 优化问题。我想问你两件事。

首先;我仔细检查了下面的链接,并试图了解 Hedengren 先生所做的更改。

Python GEKKO MINLP optimization of energy system: How to build intermediates that are 2D arrays

在本例的 .apm 模型文件中,带有文本编辑器;有“连接”。我了解那里的操作,但是我不知道代码中的哪个部分带来了这些连接。我试图效仿这个例子;我使用了类似的中间结构,但在我自己的模型中从未得到类似的连接。

另一件事;在我的中间代码中,我有求和函数。再次在模型的文本文件版本中,我看到总和总是以 0 开头,然后将变量相互添加。例如:

.....[((((((((((((0+(((((((((1+i5))^(-9)))) (2711)))(v230)))*(int_v340)))+

在模型中; T=10 G=11 上面的等式是这样的:

INV=m.Intermediate ([[sum (pow((1+r), -t)*IC[g]*Z[g,t]*Y[g,t] for g in range(G) )]for t in range(T) ] )

操作看起来正确但我不明白为什么每个括号中都有 0(零)? 它给出了无效元素错误,并用最后一个 t 值指向变量...

*** 函数字符串语法错误:无效元素:v230

这个变量 (v230) 代表 Z[11,10]。我发现它总是给出去年的错误,这意味着最高的 t 值。

另外,如果我使用 m.sum 而不是 sum;它给出了这个错误:“ x 必须是 GEKKO 参数、变量或表达式的 python 列表”

如果您能给我一个提示,我将非常感激。这可能不是什么大问题,但是我自己找不到任何解决方案。

感谢您的时间和理解。

最好的问候

【问题讨论】:

标签: python nonlinear-optimization gekko


【解决方案1】:

中间体总是在开头放一个零,以防表达式中没有参数。这是一个简单的 Gekko 脚本,显示了中间体和m.sum() 的使用。

from gekko import GEKKO
m = GEKKO()
x = m.Array(m.Var,3)
m.Equation(m.sum(x)==3)
y = m.Intermediate(sum(x))
m.Minimize(y)
for i,xi in enumerate(x):
    m.Minimize((xi-i)**2)
m.solve()
m.open_folder()
print(x)

这是由 Gekko 生成并由 APMonitor 编译成字节码的gk_model0.apm 模型文件。

Model
Variables
    v1 = 0
    v2 = 0
    v3 = 0
End Variables
Intermediates
    i0=(((0+v1)+v2)+v3)
End Intermediates
Equations
    ((v1+v2)+v3)=3
    minimize i0
    minimize (((v1-0))^(2))
    minimize (((v2-1))^(2))
    minimize (((v3-2))^(2))
End Equations
End Model

如果x numpy 数组转换为带有x=list(x) 的列表,那么它会创建一个对象并将connectionsshown in the documentation 的形式创建给这些对象。这是 APMonitor 模型。

Model
Variables
    v1 = 0
    v2 = 0
    v3 = 0
    v4 = 0
End Variables
Intermediates
    i0=(((0+v1)+v2)+v3)
End Intermediates
Equations
    v4=3
    minimize i0
    minimize (((v1-0))^(2))
    minimize (((v2-1))^(2))
    minimize (((v3-2))^(2))
End Equations
Connections
    v1 = sum_1.x[1]
    v2 = sum_1.x[2]
    v3 = sum_1.x[3]
    v4 = sum_1.y
End Connections
Objects
    sum_1 = sum(3)
End Objects
End Model

【讨论】:

  • 谢谢@TexasEngineer 我一直在尝试缩短我的代码。至少我现在知道零不是我最终出错的原因。也谢谢你的链接。我错过了关于连接的那部分。