#python #optimization #pyomo #battery #energy
#python #оптимизация #pyomo #аккумулятор #энергия
Вопрос:
В настоящее время я решаю проблему оптимизации энергопотребления с помощью pyomo. Просто чтобы дать немного контекста: моя идея состоит в том, чтобы минимизировать общие затраты в автономных сетях с помощью тарифов на время использования.
На данный момент я застрял с внедрением аккумуляторного хранилища в свой код. Моя проблема в том, что батарея имеет фиксированную емкость, и когда я вырабатываю больше избыточной солнечной энергии, чем осталось в моем аккумуляторе, я сталкиваюсь с проблемой оптимизации, потому что она становится невыполнимой.
Мой подход заключается в том, чтобы установить два условия для каждого временного шага моей проблемы:
- когда избыток солнечной энергии не превышает доступного запаса батареи: зарядите батарею полным избытком солнечной энергии
- когда избыток солнечной энергии превышает доступный запас заряда аккумулятора: полностью зарядите аккумулятор
Я попытался реализовать две двоичные переменные 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)