# -*- coding: utf-8 -*-
"""Constraints to relate variables in an existing model.
SPDX-FileCopyrightText: Uwe Krien <krien@uni-bremen.de>
SPDX-FileCopyrightText: Simon Hilpert
SPDX-License-Identifier: MIT
"""
from pyomo import environ as po
[docs]def equate_variables(model, var1, var2, factor1=1, name=None):
r"""
Adds a constraint to the given model that set two variables to equal
adaptable by a factor.
**The following constraints are build:**
.. math::
var\textit{1} \cdot factor\textit{1} = var\textit{2}
Parameters
----------
var1 : pyomo.environ.Var
First variable, to be set to equal with Var2 and multiplied with
factor1.
var2 : pyomo.environ.Var
Second variable, to be set equal to (Var1 * factor1).
factor1 : float
Factor to define the proportion between the variables.
name : str
Optional name for the equation e.g. in the LP file. By default the
name is: equate + string representation of var1 and var2.
model : oemof.solph.Model
Model to which the constraint is added.
Examples
--------
The following example shows how to define a transmission line in the
investment mode by connecting both investment variables. Note that the
equivalent periodical costs (epc) of the line are 40. You could also add
them to one line and set them to 0 for the other line.
>>> import pandas as pd
>>> from oemof import solph
>>> date_time_index = pd.date_range('1/1/2012', periods=5, freq='H')
>>> energysystem = solph.EnergySystem(timeindex=date_time_index)
>>> bel1 = solph.Bus(label='electricity1')
>>> bel2 = solph.Bus(label='electricity2')
>>> energysystem.add(bel1, bel2)
>>> energysystem.add(solph.Transformer(
... label='powerline_1_2',
... inputs={bel1: solph.Flow()},
... outputs={bel2: solph.Flow(
... investment=solph.Investment(ep_costs=20))}))
>>> energysystem.add(solph.Transformer(
... label='powerline_2_1',
... inputs={bel2: solph.Flow()},
... outputs={bel1: solph.Flow(
... investment=solph.Investment(ep_costs=20))}))
>>> om = solph.Model(energysystem)
>>> line12 = energysystem.groups['powerline_1_2']
>>> line21 = energysystem.groups['powerline_2_1']
>>> solph.constraints.equate_variables(
... om,
... om.InvestmentFlow.invest[line12, bel2],
... om.InvestmentFlow.invest[line21, bel1])
"""
if name is None:
name = "_".join(["equate", str(var1), str(var2)])
def equate_variables_rule(m):
return var1 * factor1 == var2
setattr(model, name, po.Constraint(rule=equate_variables_rule))