【问题标题】:When do I use Param rather than Const in Gekko?我什么时候在 Gekko 中使用 Param 而不是 Const?
【发布时间】:2019-11-21 18:47:03
【问题描述】:

我正在尝试将三次样条曲线拟合到下面的数据点,当我使用 Param(如示例 m.x = m.Param(value=np.linspace(-1, 6)))或使用常量 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)

【问题讨论】:

  • 仅供参考:gekko 中有一个新的 Maximize 函数,因此您的目标函数可以使用 p.Maximize(p.y) 而不是 p.Obj(-p.y) 更具可读性。

标签: python gekko


【解决方案1】:

常量Const 是单个标量值,预计不会改变。参数Param 有一个初始值,但用户可以使用数据对其进行更改。固定值FV 或操纵变量MV 是两种特殊类型的参数,它们具有extra options 用于成为求解器决策变量。 FVMV 之间的区别在于,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(或带有STATUS=0MV)是合适的gekko 对象。 Const 给出错误:ValueError: Constant value must be scalar.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 2020-03-24
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2011-12-26
    相关资源
    最近更新 更多