简体   繁体   English

我如何 model GEKKO 中的一个不随时间而随体积变化的微分方程?

[英]How do I model a differential equation in GEKKO that doesn't change with time but with Volume?

I know the normal method.我知道正常的方法。 For example...例如...

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

But what about for something like a PFR?但是对于像 PFR 这样的东西呢? It is assumed steady state but the flowrates are dependent on the volume of the reactor (or length).假设稳定 state 但流速取决于反应器的体积(或长度)。 I feel IMODE = 3 is the best if I wanted to optimize something in the model as well.如果我还想优化 model 中的某些内容,我觉得 IMODE = 3 是最好的。 I would think it would look something this.我会认为它看起来像这样。

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

Any help?有什么帮助吗? Do I just treat dt() as dVr()?我只是将 dt() 视为 dVr() 吗? and declare m.time as the Volume array?并将 m.time 声明为 Volume 数组? Is it considered a dynamic system dependent on volume instead?它是否被认为是一个依赖于体积的动态系统?

I just tested this.我刚刚测试了这个。 This below produced the same result from when I did it in odeint下面的结果与我在 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')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM