您可以从 CSV 读取输入,并将随时间变化的值分配给q_in.value
参数初始化期间(参见示例 #1)或在每个时间积分间隔值更改的循环中(参见示例 #2)。示例 1 和 2 都产生以下结果,但示例 1 更快。

m.options.IMODE=7
如果您的时间跨度很长,示例 1 的选项也可能会更快。IMODE=7
使用顺序求解方法而不是同时求解方法。
示例 1
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
t = np.arange(0,5,1/12)
step = [0 if z<2 else 2.5 for z in t]
m = GEKKO(remote=False)
k_1 = m.Param(value = 0.19)
f_1 = m.Param(value = 29.0)
V_liq = m.Param(value = 159.0)
q_in = m.Param(value = step)
X_in = m.Param(value = 271.77)
Y_in = m.Param(value = 164.34)
X = m.Var(value = 11.55)
Y = m.Var(value = 11.55*0.2)
rho_1 = m.Intermediate(k_1*X)
q_prod = m.Intermediate(0.52*f_1*X)
m.time = t
m.Equations([X.dt() == q_in/V_liq*(X_in - X) - rho_1, \
Y.dt() == q_in/V_liq*(Y_in - Y)])
m.options.IMODE = 4
m.solve(disp=False)
plt.plot(m.time,q_in.value,label=r'$q_{in}$')
plt.plot(m.time, X.value,label='X')
plt.plot(m.time, Y.value,label='Y')
plt.legend()
plt.xlabel('time')
plt.show()
示例 2
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
t = np.arange(0,5,1/12)
m = GEKKO(remote=False)
k_1 = m.Param(value = 0.19)
f_1 = m.Param(value = 29.0)
V_liq = m.Param(value = 159.0)
q_in = m.Param()
X_in = m.Param(value = 271.77)
Y_in = m.Param(value = 164.34)
X = m.Var(value = 11.55)
Y = m.Var(value = 11.55*0.2)
rho_1 = m.Intermediate(k_1*X)
q_prod = m.Intermediate(0.52*f_1*X)
m.time = [t[0],t[1]]
m.Equations([X.dt() == q_in/V_liq*(X_in - X) - rho_1, \
Y.dt() == q_in/V_liq*(Y_in - Y)])
m.options.IMODE = 4
# store Xs and Ys for plotting
for i in range (1,len(t)):
q_in.value = 0 if t[i]<2 else 2.5
m.solve(disp=False)
if i==1:
Xs = [X.value[0]]
Ys = [Y.value[0]]
Xs.append(X.value[1])
Ys.append(Y.value[1])
step = [0 if z<2 else 2.5 for z in t]
plt.plot(t,step,label=r'$q_{in}$')
plt.plot(t, Xs,label='X')
plt.plot(t, Ys,label='Y')
plt.legend()
plt.xlabel('time')
plt.show()
如果您需要q_in
依赖某些变量的值,那么您可以使用该m.if3
函数。然而,这是一个更难解决的问题,因为该m.if3
函数将问题转换为可能需要更长时间才能解决的混合整数非线性规划形式。这是一个示例 where q_in=0
whenX>8
和q_in=2.5
when X<=8
。但是,它并没有对我收敛。我不知道为什么,我需要做一些额外的挖掘,但我虽然你想拥有它,以防它对你有用。
import numpy as np
import matplotlib.pyplot as plt
from gekko import GEKKO
m = GEKKO(remote=False)
k_1 = m.Param(value = 0.19)
f_1 = m.Param(value = 29.0)
V_liq = m.Param(value = 159.0)
X_in = m.Param(value = 271.77)
Y_in = m.Param(value = 164.34)
X = m.Var(value = 11.55,name='X')
Y = m.Var(value = 11.55*0.2,name='Y')
rho_1 = m.Intermediate(k_1*X)
q_prod = m.Intermediate(0.52*f_1*X)
q_in = m.if3(8-X, 0.0, 2.5)
m.time = np.arange(0,5,1/12)
m.Equations([X.dt() == q_in/V_liq*(X_in - X) - rho_1, \
Y.dt() == q_in/V_liq*(Y_in - Y)])
m.options.IMODE = 6
m.options.SOLVER = 1
m.solve(disp=True)
plt.plot(m.time,q_in.value,label=r'$q_{in}$')
plt.plot(m.time, X.value,label='X')
plt.plot(m.time, Y.value,label='Y')
plt.legend()
plt.xlabel('time')
plt.show()
这里还有一些关于使用 Gekko 求解具有时变输入的 ODE的其他示例。