units_container

Pyomo 单位容器模块

该模块提供了在Pyomo表达式中包含单位的支持。该模块可用于在模型上定义单位,并检查模型中基础约束和表达式的单位一致性。该模块还支持使用convert方法在表达式中进行单位转换,以支持包含嵌入式单位转换的约束的构建。

要在您的Pyomo模型中使用此包,首先需要一个PyomoUnitsContainer的实例。您可以使用已经定义为‘units’的模块级实例。这个对象‘包含’了单位 - 也就是说,您可以使用常见的符号访问此模块上的单位。

>>> from pyomo.environ import units as u
>>> print(3.0*u.kg)
3.0*kg

单位可以分配给Var、Param和ExternalFunction组件,并且可以直接在表达式中使用(例如,定义约束)。您还可以验证模型上的单位是否一致,或者在目标函数、约束或表达式等单个组件上使用assert_units_consistent(来自pyomo.util.check_units)来验证单位的一致性。那里还有其他方法可能有助于验证模型上的正确单位。

>>> from pyomo.environ import ConcreteModel, Var, Objective
>>> from pyomo.environ import units as u
>>> from pyomo.util.check_units import assert_units_consistent, assert_units_equivalent, check_units_equivalent
>>> model = ConcreteModel()
>>> model.acc = Var(initialize=5.0, units=u.m/u.s**2)
>>> model.obj = Objective(expr=(model.acc - 9.81*u.m/u.s**2)**2)
>>> assert_units_consistent(model.obj) # raise exc if units invalid on obj
>>> assert_units_consistent(model) # raise exc if units invalid anywhere on the model
>>> assert_units_equivalent(model.obj.expr, u.m**2/u.s**4) # raise exc if units not equivalent
>>> print(u.get_units(model.obj.expr)) # print the units on the objective
m**2/s**4
>>> print(check_units_equivalent(model.acc, u.m/u.s**2))
True

当前的实现基于pint包,并支持pint支持的所有单位。pint支持的单位列表可以在以下网址找到: https://github.com/hgrecco/pint/blob/master/pint/default_en.txt

如果您需要一个不在标准定义单位集中的单位,您可以通过在pint中添加单位定义来创建自己的单位。有关更多信息,请参见PyomoUnitsContainer.load_definitions_from_file()PyomoUnitsContainer.load_definitions_from_strings()

注意

在这个单位的实现中,表达式中不支持温度的“偏移”单位(即非绝对温度单位,包括摄氏度和华氏度)。这是因为有许多不明显的不允许的组合。如果你首先将非绝对温度单位转换为绝对温度单位,然后执行操作,这个问题就会变得清晰。例如,如果你写30摄氏度 + 30摄氏度 == 60摄氏度,但将每个条目转换为开尔文,表达式就不成立(即303.15 K + 303.15 K不等于333.15 K)。因此,有几个操作是不允许使用非绝对单位的,包括加法、乘法和除法。

该模块确实支持将偏移单位数值转换为绝对单位,使用convert_value_K_to_C、convert_value_C_to_K、convert_value_R_to_F、convert_value_F_to_R。这些功能对于将输入数据转换为绝对单位以及将数据转换为便于报告的单位非常有用。

请参阅pint文档这里以获取更多讨论。虽然pint实现了“delta”单位(例如,delta_degC)以支持正确的单位转换,但在一般的代数建模环境中,识别和保证有效操作可能很困难。虽然未来的工作可能支持相对比例的单位,但当前的实现要求在表达式中使用绝对温度单位(即K和R),并使用特定函数直接转换数值以转换输入数据和报告。

Classes

PintUnitExtractionVisitor(pyomo_units_container)

PyomoUnitsContainer([pint_registry])

用于在Pyomo中创建和包含单元的类。

异常

InconsistentUnitsError(exp1, exp2, msg)

一个异常,表示表达式中存在不一致的单位。

UnitsError(msg)

一个异常类,用于处理与单位相关的所有一般错误/警告

Functions

as_quantity(expr)