在 Gekko 中求解 ODE 时获取以前的值
Get previous values when solving an ODE in Gekko
我正在尝试解决 Gekko 中的 DAE,其中一些组件将取决于卷积的解决方案 integral
这需要一个常量 dt,但我确信它在选项中的某处。因此,我想要做的是使用一个函数来记录数组中状态变量的当前值,以及 return 到该点的总和。这是我尝试使用一个简单的 ODE 示例:
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
class adder:
def __init__(self,):
self.i=m.Array(m.Param, 10)
self.count=0
def f(self, y):
self.i[self.count]=y
self.count+=1
return sum(self.i)
a=adder()
m.Equation(y.dt()==-y+1+a.f(y))
m.time = np.linspace(0,5)
m.options.IMODE = 4
m.solve()
但是解决方案 1) 看起来不正确,并且 2) 我无法使用 a.f() 函数打印有关该解决方案的任何信息,并且 3) 即使我设置了 self.i
的大小array 到 1,它不会抛出越界错误,所以我希望它不会以我认为的方式被调用。我还看到有人建议使用 delay()
函数,但我不知道如何访问我当前所在的时间步长以及循环遍历之前的每个时间步长。
将连续微分方程与离散方程混合可能是一项挑战。两个建议是 (1) 将 DAE 转换为离散形式(例如使用 Orthogonal Collocation on Finite Elements) or (2) use a continuous integral form of the convolution integral. The m.integral()
function is available in Gekko to help with any integral expressions. See How to solve integral in Python Gekko? and Integral Objective (Luus) 解决连续积分问题的两个示例。
Gekko 在构建模型时只调用一次函数。模型文件在 m.path
中作为 gk0_model.apm
(文本文件)或通过使用 m.open_folder()
打开文件夹找到。模型必须用符号表示,这样才能编译自动微分。
我正在尝试解决 Gekko 中的 DAE,其中一些组件将取决于卷积的解决方案 integral
这需要一个常量 dt,但我确信它在选项中的某处。因此,我想要做的是使用一个函数来记录数组中状态变量的当前值,以及 return 到该点的总和。这是我尝试使用一个简单的 ODE 示例:
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
m = GEKKO()
class adder:
def __init__(self,):
self.i=m.Array(m.Param, 10)
self.count=0
def f(self, y):
self.i[self.count]=y
self.count+=1
return sum(self.i)
a=adder()
m.Equation(y.dt()==-y+1+a.f(y))
m.time = np.linspace(0,5)
m.options.IMODE = 4
m.solve()
但是解决方案 1) 看起来不正确,并且 2) 我无法使用 a.f() 函数打印有关该解决方案的任何信息,并且 3) 即使我设置了 self.i
的大小array 到 1,它不会抛出越界错误,所以我希望它不会以我认为的方式被调用。我还看到有人建议使用 delay()
函数,但我不知道如何访问我当前所在的时间步长以及循环遍历之前的每个时间步长。
将连续微分方程与离散方程混合可能是一项挑战。两个建议是 (1) 将 DAE 转换为离散形式(例如使用 Orthogonal Collocation on Finite Elements) or (2) use a continuous integral form of the convolution integral. The m.integral()
function is available in Gekko to help with any integral expressions. See How to solve integral in Python Gekko? and Integral Objective (Luus) 解决连续积分问题的两个示例。
Gekko 在构建模型时只调用一次函数。模型文件在 m.path
中作为 gk0_model.apm
(文本文件)或通过使用 m.open_folder()
打开文件夹找到。模型必须用符号表示,这样才能编译自动微分。