python - Gekko 和中间变量

标签 python optimization gekko

我正在使用 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/

相关文章:

python - 如何在保持 turtle 形的情况下隐藏 turtle 箭?

python - 如何在 Pandas 中执行依赖于值的数据透视表/Groupby?

c++ - 优化读写大数据(C++)

python - gekko中定义最大函数时出错

python - 加入两个偏移量列表 ("offset zip"?)

css - 有没有比 @if() 更好的方法在 razor 中动态添加 css

c# - 局部变量与实例变量

python - 如何将 GEKKO 解决方案转换为浮子

python-3.x - 为什么延迟参数会影响预测曲线?

python - 销毁子解释器后释放 GIL