【问题标题】:Linear optimization of a battery storage电池存储的线性优化
【发布时间】:2022-01-10 14:57:22
【问题描述】:

我目前正在尝试使用 pyomo 优化电池存储。 我以为一切正常,但由于某种原因,存储总是在一开始就被排出。这应该是不可能的,因为一开始存储是空的……

def discharge_capacity_rule(model, t):
    return model.discharge[t] <= in_out_leistung
model.discharge_capacity_rule = Constraint(model.t, rule = discharge_capacity_rule)
def charge_capacity_rule(model, t):
    return model.charge[t] <= in_out_leistung
model.charge_capacity_rule = Constraint(model.t, rule = charge_capacity_rule)

def max_capacity_rule(model, t):
    return model.soe[t] <= battery_capacity
model.max_capacity_rule = Constraint(model.t, rule = max_capacity_rule)

def soe_start_rule(model, t):
    return model.soe[0] == soe_start 
model.soe_start_rule = Constraint(rule = soe_start_rule)
def soe_end_rule(model, t):
    return model.soe[n] == model.soe[0]
model.soe_end_rule = Constraint(rule = soe_end_rule)

def soe_rule(model, t):
    if t == 0:
        return model.soe[t] == soe_start
    else:
        return model.soe[t] == model.soe[t-1] + (model.charge[t] * in_out_efficiency) - (model.discharge[t] / in_out_efficiency)
model.soe_rule = Constraint(model.t, rule = soe_rule)

【问题讨论】:

  • 一个快速的解决办法可能就是说如果 t = 0 存储不能被释放。不确定这是否是最好的方法......

标签: python optimization pyomo


【解决方案1】:

这是 BESS 优化中的常见问题。你限制model.discharge[t] 只是为了功率(即,任何放电都不能超过 BESS 的标称功率输出),但没有明确限制放电超过可用能量。 model.soe 计算是避免放电超出可用存储能量的常用方法,但在初始时间步长期间,您只需避免计算 BESS 的充电状态并使用 return model.soe[t] == soe_start 设置为初始值,因此,在这个时间步中,放电不受model.soe_rule的约束,因为以下约束适用于除初始时间步之外的所有时间步。

model.soe[t] == model.soe[t-1] + (model.charge[t] * in_out_efficiency) - (model.discharge[t] / in_out_efficiency)

您可以尝试一些方法:

  1. 限制放电到可用的存储能量:

    您可以在任何 time.step 中限制 model.discharge[t] 小于或等于可用存储能量。这相当于 SOE 计算,因为model.soe 不能小于零,但这也适用于初始时间步长。约束是这样的:

     def discharge_leq_soe(model, t):
         model.discharge[t] <= model.soe[t]
     model.discharge_leq_soe = pyo.Constraint(model.t)
    
  2. 修复初始费用:

    正如您评论的那样,您可以在初始时间步中说,不允许放电,这将在初始时间步期间将 model.discharge 设置为零:

     model.initial_discharge_fixed = pyo.Constraint(expr=model.discharge[model.t.first()]==0)
    
  3. 不固定初始 soe:

    您也可以不修复初始充电状态,而是计算它。在这种情况下,model.chargemodel.discharge 是不固定的,model.soe[0] 是从结果中计算出来的。这可以让您对改进 de BESS 调度所需的初始 SOE 有所了解。在这种方法中,您只需将您的 soe_rule 更改为:

     def soe_rule(model, t):
         if t == 0:
             return model.soe[t] == (model.charge[t] * in_out_efficiency) - (model.discharge[t] / in_out_efficiency)
         else:
             return model.soe[t] == model.soe[t-1] + (model.charge[t] * in_out_efficiency) - (model.discharge[t] / in_out_efficiency)
     model.soe_rule = Constraint(model.t, rule = soe_rule
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-10
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2021-05-13
    • 2019-11-19
    • 2011-12-29
    相关资源
    最近更新 更多