使用顺序求解器时,如何在 Python Gekko 中定义中间值的最大值和另一个值?

How to define maximum of Intermediate and another value in Python Gekko, when using sequential solver?

在我正在编写的用于使用 GEKKO 求解微分方程组的建模框架中,我想计算参数(外力)和整数值(例如 0)的最大值,并在模型中使用结果方程式。

关键问题是,为了通过向量化函数传递参数,参数当前被包装为一个中间方程。这就是为什么一个向量化的最大值函数,例如内置的 max 和 np.maximum return TypeError: object of type 'int' has no len()

我想使用顺序求解器(例如 IMODE == 4),因此 GEKKO max2 和 max3 函数也不起作用,如下所示。

本质上,用例归结为这个最小的例子:

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

m = GEKKO()
m.time = np.arange(0,20)

y = m.Var(value=5)
forcing = m.Intermediate(m.Param(value=np.arange(-5,15)))

@np.vectorize
def value_above_zero(var):
    return m.max2(var, 0)

forcing_above_0 = value_above_zero(forcing)

m.Equation(y.dt()==-forcing_above_0*y)
m.options.IMODE=4
m.solve(disp=False)

尝试解决时出现此错误:

Exception:  @error: Degrees of Freedom
 * Error: DOF must be zero for this mode
 STOPPING...

在使用顺序求解器时,是否有某种方法可以使用 GEKKO 定义中间方程的 max 和其他一些值? 或者是否有另一种包装参数的方法,以便 np.vectorize 不会解压缩强制的时间离散值(即 gekko 参数中的数组)?

非常感谢任何帮助!

IMODE=6很好的解决了这个问题。它仍然是一个模拟,但允许额外的自由度。 IMODE=4 检查方程和变量的数量是否相等。 m.max2()m.max3() 都使用额外的自由度来解决 here.

所示的问题
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt  

m = GEKKO()
m.time = np.arange(0,20)

y = m.Var(value=5)
forcing = m.Intermediate(m.Param(value=np.arange(-5,15)))

@np.vectorize
def value_above_zero(var):
    return m.max2(var, 0)

forcing_above_0 = value_above_zero(forcing)

m.Equation(y.dt()==-forcing_above_0*y)
m.options.IMODE=6
m.solve(disp=False)