Оптимизатор, добавляющий энергию в неиспользуемую систему хранения - PullRequest
3 голосов
/ 23 апреля 2020

В настоящее время я делаю модель, в которую я буду интегрировать Аккумулятор и накопитель тепловой энергии с атомной электростанцией в электросети. Я сделал свою модель так, чтобы она правильно работала с обоими типами накопителей энергии. Проблема, с которой я сталкиваюсь, заключается в том, что, когда я комментирую одно из хранилищ так, чтобы оно каким-то образом не участвовало в хранении энергии в первые 2 временных шага, оно получает половину своей энергии по всей емкости, даже если оно отключено. Когда я комментирую другую систему, такая же проблема возникает с закомментированной системой питания. Вы знаете, что вызывает это?

Вот мой код для этого. Я упростил его, чтобы включить все.

from gekko import GEKKO
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.integrate import quad

#Set up basic power consumption data
n = 24
t = np.linspace(0,n,n)
def load(t):
    return  -10*np.sin(2*np.pi*t/24)+40
Load = load(t)
Gen = np.ones(n)*40
def need(t):
    return 10*np.sin(2*np.pi*t/24)+10

#Set up Model
m = GEKKO()
m.time = t

Cons = m.Param(value=Load)
Enuc = m.FV(value=45, lb=0) #nuclear power
Enuc.STATUS = 1

#Thermal Energy Storage
T = m.SV(value=300,ub=500,lb=300)
mass = m.FV(value=.0746,lb=0)
mass.STATUS=0
Cp = m.Param(value=5)
thermaleff = .8   #80%efficient
thermeff = m.if3((Enuc - Cons)/(mass*Cp),1/thermaleff,thermaleff)

#Battery Electrical storage
Capacity = 76.2
EStored = m.SV(value=0,lb=0,ub=Capacity)
batteryeff = .95
batteff = m.if3((Enuc - Cons),1/batteryeff,batteryeff)

#Energy Balance 
Cost = m.Var()

m.Equation(EStored.dt() == batteff*(Enuc - Cons))  #Energy balance for Battery
#m.Equation(T.dt() == thermeff*(Enuc - Cons)/(mass*Cp)) #Energy balance for Thermal Storage
m.Equation(Cost == Enuc*1000 + Capacity*1000 + mass*5000)
m.Obj(Cost)

m.options.IMODE = 5
m.options.SOLVER = 3
m.solve()

#plot
plt.subplot(3,1,1)
plt.plot(t,Load)
plt.plot(t,Enuc.value)

plt.subplot(3,1,2)
plt.plot(t,EStored.value, label=f'Capacity = {EStored.value[12]:.03}')
plt.title("Battery Storage")
plt.ylabel("Energy")
plt.legend()

plt.subplot(3,1,3)
plt.plot(t,T.value,label=f'mass = {mass.value[-1]:.03}')
plt.title("Thermal Storage")
plt.ylabel("Temperature(K)")
plt.legend()
plt.show() 

1 Ответ

3 голосов
/ 23 апреля 2020

Проблема в том, что вы исключаете уравнение, но переменная по-прежнему настраивается оптимизатором. Оптимизатор определяет, что он может заполнить хранилище бесплатно без уравнения. Вместо этого вы можете попробовать следующее, чтобы включить или отключить возможность хранения аккумулятора или тепловой энергии.

# select battery or thermal storage
battery_storage = True
thermal_storage = True
if battery_storage:
    # Energy balance for Battery
    m.Equation(EStored.dt() == batteff*(Enuc - Cons))
else:
    # Battery storage off
    m.Equation(EStored.dt() == 0)
if thermal storage:
    # Energy balance for Thermal Storage
    m.Equation(T.dt() == thermeff*(Enuc - Cons)/(mass*Cp)) 
else:
    # Thermal storage off
    m.Equation(T.dt() == 0)

Energy Storage Results

Другой вариант - определить переменные решения в качестве управляемых переменных и включите STATUS (1) или выключите (0) в зависимости от того, может ли оптимизатор их использовать. Другой вариант (более сжатый) - использовать параметр battery_storage непосредственно в уравнении как m.Equation(EStored.dt() == battery_storage*batteff*(Enuc - Cons)). Когда battery_storage равно нулю (выкл.), Тогда производная будет установлена ​​на ноль. Вы можете сделать то же самое для thermal_storage. Если вы сделаете battery_storage и thermal_storage настраиваемым параметром в качестве переменной Gekko, то вы можете включить или выключить их, когда симуляция выполняется от цикла к циклу.

...