我正在使用 GEKKO 来拟合函数。
函数的形式是已知的。 它看起来像是具有各种参数的类似子函数的总和, 每个子函数都有自己的一组参数来查找(优化)...
我认为我不完全理解中间变量的使用,并且希望对我的代码有一些帮助。 我使用中间变量来最小化代码并使其更具可读性。
我收到一个错误:
apm 212.160.70.179_gk_model1 <br><pre> ----------------------------------------------------------------
APMonitor, Version 1.0.1
APMonitor Optimization Suite
----------------------------------------------------------------
@error: Intermediate Definition
Error: Intermediate variable with no equality (=) expression
30.124819430.1605366830.1963387730.2322259530.2681985430.30425683
STOPPING...
据我了解,我得到了一些数组作为输出?
我如何了解哪个中间变量导致了问题? 或者我做错了什么?
这是代码:
# using GEKKO for preliminary fitting
xData = np.array(df['E'])
yData = np.array(df['exp_trans'])
m = GEKKO()
# parameters
x = m.Param(value = xData) # x-coordinates for fitting
z = m.Param(value = yData) # experimental results to fit to
# constants
A1 = m.Const(A1_c)
gj = m.Const(gj_c)
# variables
El_0 = m.FV(lb = borders_left[0], ub=borders_right[0])
El_1 = m.FV(lb = borders_left[1], ub=borders_right[1])
El_2 = m.FV(lb = borders_left[2], ub=borders_right[2])
G1_0 = m.FV(lb = 0.000001, ub=1)
G1_1 = m.FV(lb = 0.000001, ub=1)
G1_2 = m.FV(lb = 0.000001, ub=1)
# G2 = 0
G2_0 = m.FV(lb = 0.000000, ub=0)
G2_1 = m.FV(lb = 0.000000, ub=0)
G2_2 = m.FV(lb = 0.000000, ub=0)
Gg_0 = m.FV(lb = 0.000001, ub=1)
Gg_1 = m.FV(lb = 0.000001, ub=1)
Gg_2 = m.FV(lb = 0.000001, ub=1)
#Intermediates
k_alfa = m.Intermediate(A1*np.sqrt(x))
ro = m.Intermediate(k_alfa*ac)
G_0 = m.Intermediate(G1_0+G2_0+Gg_0)
G_1 = m.Intermediate(G1_1+G2_1+Gg_1)
G_2 = m.Intermediate(G1_2+G2_2+Gg_2)
d0 = m.Intermediate((El_0-x)**2+(G_0/2)**2)
d1 = m.Intermediate((El_1-x)**2+(G_1/2)**2)
d2 = m.Intermediate((El_2-x)**2+(G_2/2)**2)
phi = m.Intermediate(ro)
f0=m.Intermediate((1-(1-(G_0*G1_0/(2*d0)))*m.cos(2*phi)-((El_0-x)*G1_0/d0)*m.sin(2*phi)))
f1=m.Intermediate((1-(1-(G_1*G1_1/(2*d1)))*m.cos(2*phi)-((El_1-x)*G1_1/d1)*m.sin(2*phi)))
f2=m.Intermediate((1-(1-(G_2*G1_2/(2*d2)))*m.cos(2*phi)-((El_2-x)*G1_2/d2)*m.sin(2*phi)))
sigma_sum = m.Intermediate(2*math.pi*gj/k_alfa * (f0+f1+f2))
# designing an equation for the model
y = m.Var()
m.Equation(y == m.exp(-n*sigma_sum))
m.Minimize(((y-z))**2)
# Options
El_0.STATUS = 1
El_1.STATUS = 1
El_2.STATUS = 1
G1_0.STATUS = 1
G1_1.STATUS = 1
G1_2.STATUS = 1
G2_0.STATUS = 1
G2_1.STATUS = 1
G2_2.STATUS = 1
Gg_0.STATUS = 1
Gg_1.STATUS = 1
Gg_2.STATUS = 1
m.options.IMODE = 2
m.options.SOLVER = 3
m.options.MAX_ITER = 1000
m.solve(disp=1)
最佳答案
代码的问题与使用各种数据类型表示有关
例如
k_alfa = m.Intermediate(A1*np.sqrt(x))
需要更改:
k_alfa = m.Intermediate(A1*m.sqrt(x))
等等..
因为函数的输出数据类型不同。
始终检查并注意在模型和变量定义中使用各种数据类型和结构。
关于python - Gekko 和中间变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74416814/