Optimización de la batería de almacenamiento con pyomo

0

Pregunta

Actualmente estoy tratando de optimizar las Emisiones de CO2 de un househould basada en el consumo de electricidad. También incluye una batería de almacenamiento. Pero por alguna razón el estado de cálculo de la energía no funciona. Me sale este error:

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 es mi código hasta el momento:

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)

El almacenamiento ist supone que se vacía en el principio y en el final también.

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

Usted está utilizando el mismo nombre dos veces. Usted tiene model.soe como una variable y como una restricción.

Debe cambiar el nombre de uno de ellos como el modelo no puede tener dos objetos con nombre, con el mismo nombre...

2021-11-21 00:18:37

He cambiado, pero ahora solo dice: Restarting kernel... cuando trato de ejecutarlo.
saschav

Mejor respuesta

1

Así que tuve un par de errores aquí y allá. Por ejemplo, en la función objetivo, donde se me olvidó cambiar el modelo.n a modelo.t porque he cambiado el nombre de aquél en el proceso de escribir el código. El error más grande que pensaba que era olvidar crear una variable de la 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)

Ahora lo que realmente funciona.

2021-11-27 10:36:56

En otros idiomas

Esta página está en otros idiomas

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