我什么时候在 Gekko 中使用 Param 而不是 Const?
When do I use Param rather than Const in Gekko?
我正在尝试将三次样条拟合到下面的数据点,当我像示例 m.x = m.Param(value=np.linspace(-1, 6))
那样使用 Param
或使用常量 Const
.
import numpy as np
from gekko import GEKKO
xm = np.array([0, 1, 2, 3, 4, 5])
ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9])
m = GEKKO()
m.x = m.Param(value=np.linspace(-1, 6))
m.y = m.Var()
m.options.IMODE = 2
m.cspline(m.x, m.y, xm, ym)
m.solve(disp=False)
p = GEKKO()
p.x = p.Var(value=1, lb=0, ub=5)
p.y = p.Var()
p.cspline(p.x, p.y, xm, ym)
p.Obj(-p.y)
p.solve(disp=False)
常量 Const
是预计不会更改的单个标量值。参数 Param
具有初始值,但可以由用户使用数据更改。固定值 FV
或操纵变量 MV
是两种特殊类型的参数,它们具有 extra options 成为求解器决策变量。 FV
和 MV
之间的区别在于 FV
有一个值,而 MV
可以在数据 (IMODE=2
) 或时间 ( IMODE=4-9
)维度。
你有一个很好的例子,可以将三次样条拟合到数据,然后求解 0 < x < 5
范围内的最大值。
import numpy as np
from gekko import GEKKO
xm = np.array([0, 1, 2, 3, 4, 5])
ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9])
m = GEKKO()
m.x = m.Param(value=np.linspace(-1, 6))
m.y = m.Var()
m.options.IMODE = 2
m.cspline(m.x, m.y, xm, ym)
m.solve(disp=False)
p = GEKKO()
p.x = p.Var(value=1, lb=0, ub=5)
p.y = p.Var()
p.cspline(p.x, p.y, xm, ym)
p.Maximize(p.y)
p.solve(disp=False)
import matplotlib.pyplot as plt
plt.plot(xm,ym,'rs',label='Data')
plt.plot(m.x,m.y,'r.-',label='Cubic Spline')
plt.plot(p.x,p.y,'bo',label='Maximize')
plt.xlabel('x'), plt.ylabel('y')
plt.legend()
plt.show()
在您的情况下,Param
(或 MV
和 STATUS=0
)是合适的 gekko 对象。一个Const
报错:ValueError: Constant value must be scalar.
我正在尝试将三次样条拟合到下面的数据点,当我像示例 m.x = m.Param(value=np.linspace(-1, 6))
那样使用 Param
或使用常量 Const
.
import numpy as np
from gekko import GEKKO
xm = np.array([0, 1, 2, 3, 4, 5])
ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9])
m = GEKKO()
m.x = m.Param(value=np.linspace(-1, 6))
m.y = m.Var()
m.options.IMODE = 2
m.cspline(m.x, m.y, xm, ym)
m.solve(disp=False)
p = GEKKO()
p.x = p.Var(value=1, lb=0, ub=5)
p.y = p.Var()
p.cspline(p.x, p.y, xm, ym)
p.Obj(-p.y)
p.solve(disp=False)
常量 Const
是预计不会更改的单个标量值。参数 Param
具有初始值,但可以由用户使用数据更改。固定值 FV
或操纵变量 MV
是两种特殊类型的参数,它们具有 extra options 成为求解器决策变量。 FV
和 MV
之间的区别在于 FV
有一个值,而 MV
可以在数据 (IMODE=2
) 或时间 ( IMODE=4-9
)维度。
你有一个很好的例子,可以将三次样条拟合到数据,然后求解 0 < x < 5
范围内的最大值。
import numpy as np
from gekko import GEKKO
xm = np.array([0, 1, 2, 3, 4, 5])
ym = np.array([0.1, 0.2, 0.3, 0.5, 1.0, 0.9])
m = GEKKO()
m.x = m.Param(value=np.linspace(-1, 6))
m.y = m.Var()
m.options.IMODE = 2
m.cspline(m.x, m.y, xm, ym)
m.solve(disp=False)
p = GEKKO()
p.x = p.Var(value=1, lb=0, ub=5)
p.y = p.Var()
p.cspline(p.x, p.y, xm, ym)
p.Maximize(p.y)
p.solve(disp=False)
import matplotlib.pyplot as plt
plt.plot(xm,ym,'rs',label='Data')
plt.plot(m.x,m.y,'r.-',label='Cubic Spline')
plt.plot(p.x,p.y,'bo',label='Maximize')
plt.xlabel('x'), plt.ylabel('y')
plt.legend()
plt.show()
在您的情况下,Param
(或 MV
和 STATUS=0
)是合适的 gekko 对象。一个Const
报错:ValueError: Constant value must be scalar.