如何总结一个由多个值组成的gekko中间函数



我遇到的问题是,在计算c时,我不能取中间方程b的值之和。我对这个代码没有任何错误,但一旦我放入b[0],它就会给我一个TypeError: 'int' object is not subscriptable。我不知道如何解决这个问题,并得到这个中间变量b的和。

这段代码是我的一个简短版本,但它抓住了问题所在。

from math import ceil
import numpy as np
import pandas as pd
import os
from gekko import GEKKO
x1=[10.2203,10.2203,10.2203,10.2203,10.2203,10.2203,
10.2203,10.2203,10.2203,10.2203,10.2203,10.2203,
10.2203,10.2203,10.2203,10.2203,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,12.0657,12.0657,12.0657,
12.0657,12.0657,12.0657,12.0657,12.0657,12.0657,
12.0657,12.0657,12.0657]
m = GEKKO(remote=False)       
T_g= m.Param(value=x1)
e = m.FV( 2.7,lb=1,ub=4)
e.STATUS=1
l = m.FV(-35.1,lb=-38,ub=-30)
l.STATUS=1
g = m.FV(7.1,lb=5,ub=9)
g.STATUS=1
h = m.FV( 0.20,lb=0.0,ub=1.5)
h.STATUS=1
a=[None]*1
b=[None]*1
c=[None]*1
d=[None]*1
a[0]=m.Intermediate((e / (1 + (l / (T_g - 40)) ** g) + h))
b[0] = m.Intermediate(a[0]*f)
c[0] = m.Intermediate(sum(b))
m.Equation(d[0]==c[0])
m.Obj(d[0])
m.options.IMODE = 2
m.options.SOLVER = 1 # 1=APOPT, 3=IPOPT

# optimize
m.options.MAX_ITER = 40
m.options.OTOL = 1.0e-2
m.options.RTOL = 1.0e-3
m.solve(disp=True)

使用m.vsum()函数获得整个测量维度的b的总和。vsum函数需要ParamVar类型,所以只需将m.Intermediate切换到具有相关等式的m.Var定义即可。

a=m.Intermediate((e / (1 + (l / (T_g - 40)) ** g) + h))
b = m.Var(); m.Equation(b==a*5)
c=m.Intermediate(m.vsum(b))

这是完整的代码:

from gekko import GEKKO
x1=[10.2203,10.2203,10.2203,10.2203,10.2203,10.2203,
10.2203,10.2203,10.2203,10.2203,10.2203,10.2203,
10.2203,10.2203,10.2203,10.2203,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,10.4247,10.4247,
10.4247,10.4247,10.4247,10.4247,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,9.17603,9.17603,
9.17603,9.17603,9.17603,9.17603,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,10.1014,10.1014,10.1014,
10.1014,10.1014,10.1014,12.0657,12.0657,12.0657,
12.0657,12.0657,12.0657,12.0657,12.0657,12.0657,
12.0657,12.0657,12.0657]
m = GEKKO(remote=False)       
T_g= m.Param(value=x1)
e = m.FV( 2.7,lb=1,ub=4);      e.STATUS=1
l = m.FV(-35.1,lb=-38,ub=-30); l.STATUS=1
g = m.FV(7.1,lb=5,ub=9);       g.STATUS=1
h = m.FV( 0.20,lb=0.0,ub=1.5); h.STATUS=1
a=m.Intermediate((e / (1 + (l / (T_g - 40)) ** g) + h))
b = m.Var(); m.Equation(b==a*5)
c=m.Intermediate(m.vsum(b))
m.Minimize(c)
m.options.IMODE = 2
m.options.SOLVER = 1 # 1=APOPT, 3=IPOPT
# optimize
m.options.MAX_ITER = 40; m.options.OTOL = 1.0e-2
m.options.RTOL = 1.0e-3; m.solve(disp=True)

最新更新