消除pyomo mod中的等式约束

2024-09-28 13:20:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我想通过替换消除pyomo模型中积分变量的线性等式约束。例如,我希望转换模型

enter image description here

通过替换

enter image description here(*)

enter image description here

有没有办法在pyomo模型中执行这样的替换?我将能够通过计算相应的线性丢番图方程组的解空间以y = const_vec + susbtitution_matrix * eta的形式得到(*),在我们的例子中

const_vec = np.array([1,0,0])
substitution_matrix = np.array([[-1,0],
                                [1,0],
                                [0,1]])

Tags: 模型np空间线性方程组arraymatrix形式
1条回答
网友
1楼 · 发布于 2024-09-28 13:20:12

您所描述的通常称为“变量聚合”。如您所述,有四个基本步骤:

  1. 确定要删除的线性等式方程
  2. 计算代换映射
  3. 停用要删除的相等约束
  4. 替换所有剩余约束上的变量

听起来你已经控制了1和2。对于3,假设您标识了一个要停用的约束m.c,只需调用m.c.deactivate()。在

对于4,您将希望为剩余的约束“body”表达式生成新的表达式(变量只出现在正文中,而不出现在下界/上界)。对于当前的Pyomo版本(到5.4.x),您可以通过利用clone_expression()来执行变量替换。您需要生成一个“替换映射”:一个dict,它将要使用的变量的id()映射到要使用的新表达式。例如:

from pyomo.core.base.expr import clone_expression

m = ConcreteModel()
m.y = Var([1,2,3])
m.eta = Var([1,2])
# ...
m.c = Constraint(expr=m.y[1]**2 + m.y[3]**2 <= 4)
# ...

substitution_map = {
    id(m.y[1]): 1 - m.eta[1],
    id(m.y[2]): m.eta[1],
    id(m.y[3]): m.eta[2],
}
m.c = (m.c.lower, clone_expression(m.c.body, substitute=substitution_map), m.c.upper)

最后,免责声明:

  1. 用这种语法设置约束应该适用于最近的Pyomo发行版(我在5.1版中测试过)
  2. 这种方法在技术上违反了当前Pyomo表达式系统中的一个假设(它生成潜在的“纠缠”表达式:共享公共子树的表达式)。虽然不“好”,但它不应该引起麻烦,除非你做额外的转换/表达式操作。在
  3. pyomo5.5将有一个新的表达式系统,它可能有一个不同的机制来操作/替换变量。在

相关问题 更多 >

    热门问题