【问题标题】:How to model a time-dependent constraint in Gekko?如何在 Gekko 中模拟时间相关的约束?
【发布时间】:2021-06-23 19:24:49
【问题描述】:

我是 Python 中的 Gekko 库的新手,想知道我是否可以在 Gekko 中按照 LP 公式建模。

LP 公式的意思是我想找到最优的电器调度转移,从而使总电力成本最小化。但是,如约束所示,每天的总耗电量 (f_app*P_app) 必须保持一致。

我的代码如下所示,但我收到以下错误“x 必须是 GEKKO 参数、变量或表达式的 python 列表”,我不知道如何解决。

代码:

import numpy as np
from gekko import GEKKO

m = GEKKO()
m.time = np.linspace(1, 24, 24)

TOU_list = [0.074646,0.074646,0.074646,0.074646,0.074646,0.074646,\
            0.074646,0.099206,0.099206,0.099206,0.099206,\
            0.169230,0.169230,0.169230,0.169230,0.169230,0.099206,\
            0.099206,0.099206,0.099206,0.074646,0.074646,\
            0.074646,0.074646] # Electricity Cost
        
TOU = m.Param(value= TOU_list)
P_app = 10.5 # Appliance power (kW)
f_app = m.MV(lb=0.0, ub=1.0, integer=False) # electric appliance schedule (0-1)

m.Equation(m.sum(f_app) == 15) # Summation of the appliance schedule for 24 hour time horizon         

m.Minimize(TOU*f_app*P_app)

m.options.IMODE = 6
m.options.SOLVER = 3
m.solve(disp=True, GUI=False)

【问题讨论】:

    标签: gekko


    【解决方案1】:

    m.sum() 是该特定时间点的值的总和。尝试使用m.integral() 来生成时间范围内的总和。使用m.fix_final(c,15) 将积分的最终值固定为15。将m.options.SOLVER=1integer=True 一起使用,否则设备可以打开小数值。

    import numpy as np
    from gekko import GEKKO
    
    m = GEKKO()
    m.time = np.linspace(0, 24, 25)
    
    # Electricity Cost
    TOU_list = [0.074646,0.074646,0.074646,0.074646,0.074646,0.074646,\
                0.074646,0.074646,0.099206,0.099206,0.099206,0.099206,\
                0.169230,0.169230,0.169230,0.169230,0.169230,0.099206,\
                0.099206,0.099206,0.099206,0.074646,0.074646,\
                0.074646,0.074646] 
            
    TOU = m.Param(value= TOU_list)
    P_app = 10.5 # Appliance power (kW)
    # electric appliance schedule (0-1)
    f_app = m.MV(value=0,lb=0.0, ub=1.0, integer=True)
    f_app.STATUS = 1
    
    # Summation of the appliance schedule for 24 hour time horizon
    c = m.integral(f_app)
    m.fix_final(c,15)
    
    m.Minimize(TOU*f_app*P_app)
    
    m.options.IMODE = 6
    m.options.SOLVER = 1
    m.solve(disp=True, GUI=False)
    
    import matplotlib.pyplot as plt
    plt.plot(m.time,f_app.value,label='On / Off')
    plt.plot(m.time,TOU_list,label='Electricity Cost')
    plt.legend()
    plt.show()
    

    我在开始时添加了一个额外的时间点,因为它是 24 小时,总共 25 个时间点。如果有 1 小时,那么优化问题需要两个时间点来定义开始和结束。 24小时,需要25分。

    您可以通过使用m.Array() 对 24 个时间段进行编程来避免动态控制模式的一些复杂性。这样您就可以使用m.sum(),因为f_app 是一个包含24 个值的数组。

    import numpy as np
    from gekko import GEKKO
    
    m = GEKKO()
    
    # Electricity Cost
    TOU_list = [0.074646,0.074646,0.074646,0.074646,0.074646,0.074646,\
                0.074646,0.099206,0.099206,0.099206,0.099206,\
                0.169230,0.169230,0.169230,0.169230,0.169230,0.099206,\
                0.099206,0.099206,0.099206,0.074646,0.074646,\
                0.074646,0.074646] 
    n = len(TOU_list)
            
    P_app = 10.5 # Appliance power (kW)
    # electric appliance schedule (0-1)
    f_app = m.Array(m.Var,n,value=0,lb=0.0, ub=1.0, integer=True)
    
    # Summation of the appliance schedule for 24 hour time horizon
    m.Equation(m.sum(f_app)==15)
    
    for i in range(n):
        m.Minimize(TOU_list[i]*f_app[i]*P_app)
    
    m.options.IMODE = 3
    m.options.SOLVER = 1
    m.solve(disp=True)
    
    f = []
    t = []
    for i in range(n):
        t.append(i+1)
        f.append(f_app[i].value[0])
    
    import matplotlib.pyplot as plt
    plt.bar(x=t,height=f,label='On / Off')
    plt.bar(x=t,height=TOU_list,label='Electricity Cost')
    plt.legend()
    plt.show()
    

    因为问题没有微分方程,我推荐第二种方法。

    【讨论】:

    • 非常感谢您的回答。两者都完美地工作:)。
    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2020-10-03
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多