Python 我如何在GEKKO中建立一个不';不是随时间而变,而是随体积而变?

Python 我如何在GEKKO中建立一个不';不是随时间而变,而是随体积而变?,python,differential-equations,gekko,Python,Differential Equations,Gekko,我知道一般的方法。例如 m.Equation(x.dt() == v) 但是像PFR这样的东西呢?假设为稳态,但流速取决于反应器的体积(或长度)。如果我也想优化模型中的某些内容,我觉得IMODE=3是最好的。我想它看起来会像这样 m.Equation(Fa.dVr() == -ra) 有什么帮助吗?我只是把dt()当作dVr()吗?并将m.time声明为卷数组?它被认为是一个依赖于体积的动态系统吗?我刚刚测试了这个。下面的结果与我在odeint中所做的结果相同 from gekko impo

我知道一般的方法。例如

m.Equation(x.dt() == v)
但是像PFR这样的东西呢?假设为稳态,但流速取决于反应器的体积(或长度)。如果我也想优化模型中的某些内容,我觉得IMODE=3是最好的。我想它看起来会像这样

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

有什么帮助吗?我只是把dt()当作dVr()吗?并将m.time声明为卷数组?它被认为是一个依赖于体积的动态系统吗?

我刚刚测试了这个。下面的结果与我在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')

Gekko只使用一维导数,因此
x.dt()
可以是体积的导数。若你们想创建一个动态的PFR,那个么一个解决方案就是在空间中离散化,让Gekko负责时间上的离散化。以下是双曲线和抛物线偏微分方程的示例:
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')