Python Gekko - 如何将内置的最大值函数与顺序求解器一起使用?
Python Gekko - How to use built-in maximum function with sequential solvers?
当使用 GEKKO 附带的 max2
和 max3
函数时,在 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...
我通过查看代码知道 max2
和 max3
都在方程式中使用了不等式表达式,这可以理解地引入了自由度,所以这个功能不是故意的吗?可以有一些解决方法来解决这个问题吗?
如有任何帮助,我们将不胜感激!
注意:
我希望这不是 的重复,而是针对本质上相同的问题提出更简洁和不同的问题。
切换到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 附带的 max2
和 max3
函数时,在 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...
我通过查看代码知道 max2
和 max3
都在方程式中使用了不等式表达式,这可以理解地引入了自由度,所以这个功能不是故意的吗?可以有一些解决方法来解决这个问题吗?
如有任何帮助,我们将不胜感激!
注意:
我希望这不是
切换到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
呈指数增长,超出了机器精度,所以我将方程式改为可以求解的方程式。