我需要求解活塞流化学反应器关于距离而不是时间的微分方程。 Gekko 使用
m.time
定义时间范围,并使用 y.dt()
在方程中使用 dy/dt
。对于积分距离的问题,是否可以转换为 m.distance
和 y.dx()
以使问题更容易阅读?
这是一个尝试:
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
k = 10
m.distance = np.linspace(0,20,100)
y = m.Var(value=5)
t = m.Param(value=m.time)
m.Equation(k*y.dx()==-t*y)
m.options.IMODE=4
m.solve(disp=False)
plt.plot(m.distance,y.value)
plt.xlabel('distance')
plt.ylabel('y')
plt.show()
Traceback (most recent call last):
File "C:\Users\johnh\Desktop\test1.py", line 11, in <module>
m.Equation(k*y.dx()==-t*y)
File "C:\Users\johnh\Python311\Lib\site-packages\gekko\gk_operators.py", line 36, in __getattr__
raise AttributeError(name)
AttributeError: dx. Did you mean: 'dt'?
我不需要求解偏微分方程 (PDE) 来进行活塞流反应器的动态模拟,只需求解沿反应器的稳态浓度分布。有什么简单的方法可以在距离方面重新定义 Gekko 并使模型更具可读性?
Gekko 可以根据时间或距离(或两者)进行整合,但命名是针对时间而构建的。使其更具可读性的一个想法是使用内置名称,但创建
m.time
的副本作为 m.distance
和 der()
函数,例如:
# redefine time basis as distance
m.time = np.linspace(0,20,100)
m.distance = m.time
def der(v):
return v.dt()
这是一个更易读的版本,阐明了距离与时间的积分。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO()
# redefine time basis as distance
m.time = np.linspace(0,20,100)
m.distance = m.time
def der(v):
return v.dt()
k = 10
y = m.Var(value=5)
x = m.Param(value=m.distance)
m.Equation(k*der(y)==-x*y)
m.options.IMODE=4
m.solve(disp=False)
plt.plot(m.distance,y.value)
plt.xlabel('distance')
plt.ylabel('y')
plt.show()