首页 > 解决方案 > 在过程模拟期间初始化状态变量的导数

问题描述

使用 GEKKO 模拟过程时(例如,此处的示例 15 ),我将如何设置状态变量的导数的初始值?我使用的是 IMODE=4,但我也可以使用 IMODE=7。

[编辑] 我已经使用 IMODE=5 拟合了带有测量输入和输出的 ODE 模型的参数,我想预测超出测量时间点的模型输出。

标签: gekko

解决方案


以下是从同一链接对问题 8 的修改,作为一个简单示例。要初始化导数,请创建一个新变量,例如dydt并定义一个等于导数的新方程。

问题 8

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()
k = 10
m.time = np.linspace(0,20,100)

y = m.Var(value=5)
dydt = m.Var(value=0)
t = m.Param(value=m.time)
m.Equation(k*dydt==-t*y)
m.Equation(dydt==y.dt())
m.options.IMODE=4
m.solve(disp=False)

plt.plot(m.time,y.value,label='y')
plt.plot(m.time,dydt.value,label='dy/dt')
plt.xlabel('time'); plt.ylabel('y')
plt.legend(); plt.grid(); plt.show()

与其他微分代数方程 (DAE) 求解器不同,Gekko 不需要状态和导数的一致初始条件。Gekko 还可以解决更高索引的 DAE,其中索引是必须区分约束以返回 ODE 形式的次数。


推荐阅读