在 Python 中按顺序求解模型时,GEKKO(即 IMODE >= 4)在使用 GEKKO 附带的 max2
和 max3
函数时失败。
这适用于以下用例,其中 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)
返回:
Exception: @error: Degrees of Freedom
* Error: DOF must be zero for this mode
STOPPING...
通过查看代码,我知道 max2
和 max3
在方程中都使用了不等式表达式,这可以理解地引入了自由度,所以这个功能从来都不是有意的?可以有一些解决方法来解决这个问题吗?
任何帮助将不胜感激!
注意: 我希望这不是 How to define maximum of Intermediate and another value in Python Gekko, when using sequential solver? 的重复项,而是提出一个更简洁且不同的问题,本质上是同一个问题。
最佳答案
您可以通过切换到 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
呈指数增长超出机器精度,因此我将方程转换为可以求解的方程。
关于gekko - Python Gekko - 如何将内置最大函数与顺序求解器一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65099694/