使用顺序求解器时,如何在 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)
在我正在编写的用于使用 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)