【问题标题】:Gekko, pass dynamic parameter to pwlGekko,将动态参数传递给 pwl
【发布时间】:2020-06-11 15:14:53
【问题描述】:

这个示例代码完美地展示了我的问题

from gekko import GEKKO
model = GEKKO(remote=False)
x = model.Array(model.Var,(10),lb=0, ub=2,value=0)

b = model.Array(model.Var,(3))
p = []
p.append(model.Param(sum(x)/10+0.25))
p.append(model.Param(sum(x)/10))
d = 1e-5
x_data = [-1e5,0.25,0.25+d,1,1+d,1.5,1.5+d,1e5]
y_data = [0.1,0.1,0.75,0.75,1.25,1.25,1.7,1.7]
model.pwl(p[0], b[0], x_data, y_data)
model.pwl(p[1], b[1], x_data, y_data)
model.pwl(x[0], b[2], x_data, y_data)

model.options.IMODE = 2
model.options.SOLVER = 1
model.Obj(-1*(b[0]+b[1]))
model.solve()
print(x)
print(p)
print(b)

这有一个目标为 7.6 的成功解决方案(甚至不确定它来自哪里),但所有 x 值都设置为 0,除了 x[1] 为 1,这意味着 p[0] 为 0.35而 p[1] 为 0.1。情况并非如此,因为两者都等于零。 b[0] 和 b[1] 等于 1.7,即使 p[0] 和 p[1] 是正确的也不应该是这种情况。 b[2] 正确设置为 0.75。

【问题讨论】:

    标签: python gekko


    【解决方案1】:

    p[0]p[1] 是参数时,值在初始化时指定,不会使用x 的新值进行更新。要使用 x 的值更新它们,您可以将它们指定为变量 m.Var() 并添加几个方程。

    from gekko import GEKKO
    model = GEKKO(remote=False)
    x = model.Array(model.Var,10,lb=0, ub=2,value=0)
    
    b = model.Array(model.Var,3)
    p = model.Array(model.Var,2)
    model.Equation(p[0]==model.sum(x)/10+0.25)
    model.Equation(p[1]==model.sum(x)/10)
    d = 1e-5
    x_data = [-1e5,0.25,0.25+d,1,1+d,1.5,1.5+d,1e5]
    y_data = [0.1,0.1,0.75,0.75,1.25,1.25,1.7,1.7]
    model.pwl(p[0], b[0], x_data, y_data)
    model.pwl(p[1], b[1], x_data, y_data)
    model.pwl(x[0], b[2], x_data, y_data)
    
    model.options.IMODE = 3
    model.options.SOLVER = 1
    model.Maximize(b[0]+b[1])
    model.solve()
    print('x:' + str(x))
    print('p:' + str(p))
    print('b:' + str(b))
    

    我也切换到model.Maximize()而不是model.Obj(-1*()),并将Pythonsum替换为更高效的gekkomodel.sum(),尤其是对于大规模问题。您也可以在IMODE=3 中运行,因为您只有一个已求解的模型实例。 IMODE=2 用于数据回归问题,其中您有多个数据点并且对每个数据点应用相同的模型。更新后的问题给出了解决方案:

    x:[[1.0] [0.54918319668] [0.54918319668] [0.54918319668] [0.54918319668]
     [0.54918319668] [0.54918319668] [0.54918319668] [0.65581762324] [2.0]]
    p:[[1.00001] [0.75001]]
    b:[[1.7] [1.7] [0.75]]
    

    PWL 松弛变量可能对目标函数有一些贡献。我建议您不要使用求解器目标,而是在报告解决方案后重新计算目标。详细请看PWL function are given in the documentation

    【讨论】:

    • 由于方程,参数停止变化,但是在将 if3 添加到模型后,该模型使用了一个中间变量,该变量是使用 PWL 函数给出的结果计算的(这是我目前理解的第二个参数) ,PWL 函数的结果变为不可能的值,就好像它受模型控制一样。更改 if3 的 x1 和 x2 会更改 PWL 函数的结果,即使 if3 没有在代码中的任何地方使用,它只是声明的。如果需要,我会尝试为我的问题做一个最小的例子,但这似乎相当困难
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多