Как реализовать пределы емкости аккумулятора при полной зарядке в задаче оптимизации энергопотребления pyomo?

#python #optimization #pyomo #battery #energy

#python #оптимизация #pyomo #аккумулятор #энергия

Вопрос:

В настоящее время я решаю проблему оптимизации энергопотребления с помощью pyomo. Просто чтобы дать немного контекста: моя идея состоит в том, чтобы минимизировать общие затраты в автономных сетях с помощью тарифов на время использования.

На данный момент я застрял с внедрением аккумуляторного хранилища в свой код. Моя проблема в том, что батарея имеет фиксированную емкость, и когда я вырабатываю больше избыточной солнечной энергии, чем осталось в моем аккумуляторе, я сталкиваюсь с проблемой оптимизации, потому что она становится невыполнимой.

Мой подход заключается в том, чтобы установить два условия для каждого временного шага моей проблемы:

  1. когда избыток солнечной энергии не превышает доступного запаса батареи: зарядите батарею полным избытком солнечной энергии
  2. когда избыток солнечной энергии превышает доступный запас заряда аккумулятора: полностью зарядите аккумулятор

Я попытался реализовать две двоичные переменные y и x. Но я не совсем понимаю, как это сделать правильно. Или это достижимо только с помощью дизъюнктов в pyomo? Потому что это тема, которую я еще не совсем понял, используя в pyomo…

 P_Bat = 0.75  # Maximum charge/discharge amount per time step
E_Bat = 1.2  # 1.2 kWh battery capacity
SOC_min = 0.4
SOC_max = 1
bat_0 = E_Bat * SOC_max

...

m.p1 = Var(m.T, domain=NonNegativeReals) 
m.bat = Var(m.T, domain=NonNegativeReals, bounds=(SOC_min * E_Bat, SOC_max * E_Bat)) # Energy in battery for each time step
m.charge = Var(m.T, domain=NonNegativeReals, bounds=(0, P_Bat))
m.discharge = Var(m.T, domain=NonNegativeReals, bounds=(0, P_Bat))
m.y = Var(m.T, within=Binary)
m.x = Var(m.T, within=Binary)

...

def energy_bat_rule(m, t):
    if t == m.T.first():
        return m.bat[t] == bat_0   m.charge[t] - m.discharge[t]
    return m.bat[t] == m.bat[t-1]   m.charge[t] - m.discharge[t]
m.Energy_Bat = Constraint(m.T, rule=energy_bat_rule)

def charge_bat_rule(m, t):
    return m.charge[t] == (zeitwerte.at[t, "Solarleistung[kW]"] - m.p1[t]) * m.y[t]   (E_Bat - m.bat[t]) * m.x[t]
m.Charge_Bat = Constraint(m.T, rule=charge_bat_rule)