Otimização de uma bateria de armazenamento com pyomo

0

Pergunta

Atualmente estou tentando otimizar as Emissões de CO2 de um househould com base no consumo de eletricidade. Também inclui uma bateria de armazenamento. Mas, por algum motivo, o estado de cálculo da energia não funciona. Estou recebendo este erro:

WARNING: Implicitly replacing the Component attribute soe (type=<class
    'pyomo.core.base.var.IndexedVar'>) on block unknown with a new Component
    (type=<class 'pyomo.core.base.constraint.IndexedConstraint'>). This is
    usually indicative of a modelling error. To avoid this warning, use
    block.del_component() and block.add_component().

Restarting kernel...

Este é o meu código até agora:

model = ConcreteModel()

n = 30
model.t = RangeSet(1, n)

model.consumption = Param(model.t, initialize = df['Consumption'])
model.pv = Param(model.t, initialize = df['PV'])
model.emissionen = Param(model.t, initialize = df['CO2-Emissions'])
model.heatpump = Param(model.t, initialize = df['Heatpump'])

in_out_leistung = bt.iloc[1]['Values']
in_out_efficiency = bt.iloc[2]['Values']
battery_capacity = bt.iloc[0]['Values'] 
soe_start = 0
elec_import_max = 200

model.soe = Var(model.t, initialize = 0, within = NonNegativeReals)
model.charge = Var(model.t, within = NonNegativeReals, initialize = 0)
model.discharge = Var(model.t, within = NonNegativeReals, initialize = 0)
model.elec_grid = Var(model.t, bounds = (0, elec_import_max), within = NonNegativeReals)

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):
    return model.soe[1] == soe_start 
model.soe_start_rule = Constraint(rule = soe_start_rule)

def soe(model, t):
    if t == 1:
        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 = Constraint(model.t, rule = soe)

def soe_end_rule(model):
    return model.soe[n] == model.soe[1]
model.soe_end_rule = Constraint(rule = soe_end_rule)

def demand(model, t):
    return model.demand[t] == model.heatpump[t] + model.consumption[t] + model.charge[t]
model.demand = Constraint(model.t, rule = demand)

def lastdeckung(model, t):
    return model.pv[t] + model.elec_grid[t] + model.discharge[t] == model.demand[t]
model.lastdeckung = Constraint(model.t, rule = lastdeckung)

def emissionsreduzierung(model, t):
    return sum(model.elec_grid[t] * model.emissionen[t] for t in model.n)
model.emissionsreduzierung = Objective(rule = emissionsreduzierung, sense = minimize)

O armazenamento ist suposto ser vazia no início e no final também.

optimization pyomo python
2021-11-20 18:35:47
2
1

Você está usando o mesmo nome duas vezes. Você tem model.soe como uma variável e como uma restrição.

Você deve mudar o nome de um deles como o modelo não pode ter dois objetos nomeados com o mesmo nome...

2021-11-21 00:18:37

Eu mudei que até, mas agora ele só diz Restarting kernel... quando eu tento executá-lo.
saschav

Melhor resposta

1

Então, eu tinha alguns erros aqui e ali. Por exemplo, na função objetivo, onde eu esqueci de mudar o modelo.n ao modelo.t porque eu renomeado que, no processo de escrever o código. O maior erro que pensei que estava esquecendo de criar uma variável para a demanda.

model.demand = Var(model.t, within = NonNegativeReals)

def demand_rule(model, t):
    return model.demand[t] == model.heatpump[t] + model.consumption[t] + model.charge[t]
model.demand_rule = Constraint(model.t, rule = demand_rule)

Agora ele realmente funciona.

2021-11-27 10:36:56

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................