Python Gekko - 如何将内置的最大值函数与顺序求解器一起使用?

Python Gekko - How to use built-in maximum function with sequential solvers?

当使用 GEKKO 附带的 max2max3 函数时,在 Python GEKKO 中顺序求解模型(即 IMODE >= 4)失败。

这适用于 np.maximum 或标准 max 函数将 GEKKO 参数视为数组的用例,这并不总是预期的用法,或者在与整数进行比较时可能会产生错误例如。

最小代码示例:

from gekko import GEKKO
import numpy as np

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

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

m.Equation(y.dt()== m.max2(forcing,0) * y)
m.options.IMODE=4
m.solve(disp=False)

returns:

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

我通过查看代码知道 max2max3 都在方程式中使用了不等式表达式,这可以理解地引入了自由度,所以这个功能不是故意的吗?可以有一些解决方法来解决这个问题吗?

如有任何帮助,我们将不胜感激!

注意: 我希望这不是 的重复,而是针对本质上相同的问题提出更简洁和不同的问题。

切换到IMODE=6即可获得成功解。 IMODE=4(同步仿真)或IMODE=7顺序仿真需要零自由度。 m.max2()m.max3() 都需要自由度和优化器来求解。

from gekko import GEKKO
import numpy as np

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

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

m.Equation(y.dt()== -m.max2(forcing,0) * y)
m.options.IMODE=6
m.solve(disp=True)

方程式 y.dt()== -m.max2(forcing,0) * y 呈指数增长,超出了机器精度,所以我将方程式改为可以求解的方程式。