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

在使用顺序解算器时,如何在Python Gekko中定义中间值的最大值和另一个值?,python,numpy,gekko,Python,Numpy,Gekko,在我正在编写的用GEKKO求解微分方程组的建模框架中,我想计算一个参数(外部作用力)和一个整数值(例如0)的最大值,并在模型方程中使用结果 关键问题是,为了通过矢量化函数传递参数,参数当前被包装为一个中间方程。这就是为什么一个向量化的最大值函数,比如内置的max和np.maximum返回TypeError:type'int'的对象没有len() 我想使用顺序解算器(例如IMODE==4),因此GEKKO max2和max3函数也不起作用,如下所示 从本质上讲,用例可以归结为这个最小的示例: fr

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

关键问题是,为了通过矢量化函数传递参数,参数当前被包装为一个中间方程。这就是为什么一个向量化的最大值函数,比如内置的max和np.maximum返回
TypeError:type'int'的对象没有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()
都使用额外的自由度来解决问题,如图所示

从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
m=GEKKO()
m、 时间=np.arange(0,20)
y=m.Var(值=5)
强制=m.mediate(m.Param(值=np.arange(-5,15)))
@矢量化
def值高于零(var):
返回m.max2(变量,0)
强制高于0=值高于0(强制)
m、 方程(y.dt()==-迫使_高于_0*y)
m、 选项。IMODE=6
m、 求解(disp=False)