python - 如何在 GEKKO 中模拟不随时间变化但随体积变化的微分方程?

标签 python differential-equations gekko

我知道正常的方法。例如……

m.Equation(x.dt() == v)

但是对于像 PFR 这样的东西呢?假定稳态,但流速取决于 react 器的体积(或长度)。如果我也想优化模型中的某些内容,我觉得 IMODE = 3 是最好的。我认为它看起来应该是这个样子。

m.Equation(Fa.dVr() == -ra)

有什么帮助吗?我只是将 dt() 视为 dVr() 吗?并将 m.time 声明为 Volume 数组?它是否被视为依赖于体积的动态系统?

最佳答案

我刚刚测试过这个。下面的结果与我在 odeint 中做的结果相同

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint



k = .00384
Keq = 4
KB = .46
KW = 3.20
Ca_0 = 1.5
Cb_0 = 1.5
Cc_0 = 0
Cd_0 = 0
Fa_0 = 1 # mol/h
v = Fa_0/Ca_0
Fb_0 = Cb_0*v
Fc_0 = 0
Fd_0 = 0

m = GEKKO()
m.time = np.linspace(0, 4000, 1000)

Fa = m.Var(Fa_0)
Fb = m.Var(Fb_0)
Fc = m.Var(Fc_0)
Fd = m.Var(Fd_0)

Ca = m.Intermediate(Fa/v)
Cb = m.Intermediate(Fb/v)
Cc = m.Intermediate(Fc/v)
Cd = m.Intermediate(Fd/v)

r = m.Intermediate(k*(Ca*Cb - Cc*Cd/Keq)/\
                  ( 1 + KB*Cb + KW*Cd))

m.Equation(Fa.dt() == -r)
m.Equation(Fb.dt() == -r)
m.Equation(Fc.dt() ==  r)
m.Equation(Fd.dt() ==  r)

m.options.IMODE = 4
m.solve(disp=False)

plt.plot(m.time, Fa.value, label='Fa')
plt.plot(m.time, Fb.value, label='Fb')
plt.plot(m.time, Fc.value, label='Fc')
plt.plot(m.time, Fd.value, label='Fd')
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint



k = .00384
Keq = 4
KB = .46
KW = 3.20
Ca_0 = 1.5
Cb_0 = 1.5
Cc_0 = 0
Cd_0 = 0
Fa_0 = 1 # mol/h
v = Fa_0/Ca_0
Fb_0 = Cb_0*v
Fc_0 = 0
Fd_0 = 0

def f(F, W):
    Fa, Fb, Fc, Fd = F
    Ca, Cb, Cc, Cd = Fa/v, Fb/v, Fc/v, Fd/v
    r = k*(Ca*Cb - Cc*Cd/Keq)/( 1 + KB*Cb + KW*Cd)
    
    return -r, -r, r, r
W = np.linspace(0, 4000, 1000)
Fa1, Fb1, Fc1, Fd1 = odeint(f, [Fa_0, Fb_0, Fc_0, Fd_0], W).T

plt.plot(W, Fa1, label='Fa')
plt.plot(W, Fb1, label='Fb')
plt.plot(W, Fc1, label='Fc')
plt.plot(W, Fd1, label='Fd')

关于python - 如何在 GEKKO 中模拟不随时间变化但随体积变化的微分方程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67184911/

相关文章:

c++ - try..catch cython 中等效的宏包装器

python - 多重网格泊松求解器

wolfram-mathematica - 如何使用mathematica绘制斜率场?

python - 使用 GEKKO 获取非线性方程的所有根

gekko - 当我使用较少的 nlp 迭代时,APOPT 正在为 MINLP 问题找到更好的局部最小值。我期待相反的结果,我错过了什么?

Python Tkinter 输入框

Python字典: Compare keys with Values of All Keys

python - 将 GEKKO 与 MINLP 求解器结合使用时如何知道方程的最大数量

python - 编程错误: not all arguments converted during string formatting

r - 如何指定求解微分方程的最终值(而不是初始值)