Рассмотрим следующий сценарий:
- 2 генератора мощности, с верхней и нижней границей
- у одного генератора потери мощности составляют 30%
- общая вырабатываемая мощность должна удовлетворять внешнюю потребность в электроэнергии.
- цель состоит в том, чтобы минимизировать потери энергии.
Код: Выделить всё
import numpy as np
from gekko import GEKKO
import matplotlib.pyplot as plt
timesim = 24*1 # hours
timesteps = 1 # steps/hour
n = np.int64(timesim*timesteps + 1) # this is the vector length in GEKKO
Edh_demand =np.ones(timesim+1)*80;
Edh_demand[int(7*n/24):int(10*n/24)] = 200
Edh_demand[int(3*n/4)-1:int(3*n/4)+2] = 300
m = GEKKO(remote=False) # initialize gekko, körs lokalt
m.time = np.linspace(0, 24, 25) # Gekko-tid
Egen1 = m.Var(value = 30, lb = 30, ub = 200)
Egen2 = m.Var(value = 30, lb = 30, ub = 200)
Eloss = m.Var(value = 30*.3)
Eprod = m.Var(value = 30)
Edemand = m.Param(value = Edh_demand)
cost = m.Param(value = 10)
m.Equation(Eloss == Egen1*.3)
m.Equation(Eprod == Egen2 + Egen1 - Eloss)
m.Minimize(Eloss)
m.Equation(Eprod >= Edemand)
m.options.SOLVER = 3
m.options.IMODE = 6
# m.options.COLDSTART=2
m.options.COLDSTART=0
m.solve(disp=True)
plt.figure(5)
plt.subplot(2, 1, 1)
plt.plot(m.time, Egen1, label='gen 1')
plt.plot(m.time, Egen2, label='gen 2')
plt.legend()
plt.subplot(2, 1, 2)
plt.plot(m.time, Edemand, '--r')
plt.plot(m.time, Eprod)
plt.show()
- Как это реализовано сейчас, gen1 переходит к своей нижней границе как ожидал. Я хочу ограничить gen1 так, чтобы он мог работать либо на нижней границе, либо на 0, но не между 0 и gen1_lb.
- Я хочу наказать за выключение и включение gen1.
Я хочу ограничить поколение 1, чтобы при каждом его выключении требовалось 2 интервала выборки, прежде чем его можно будет снова включить. - Есть ли лучшие способы (в основном для эффективности алгоритма, но также и для удобочитаемости) реализовать такую проблему?
Код: Выделить всё
m.Equation(gen1 * gen1_onoff
Подробнее здесь: [url]https://stackoverflow.com/questions/79042147/handling-on-off-behavior-in-milp-optimization-problems-in-gekko[/url]