Python Gekko 微分方程解关于距离,而不是时间

问题描述 投票:0回答:1

我需要求解活塞流化学反应器关于距离而不是时间的微分方程。 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 并使模型更具可读性?

python ode gekko
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.