如何在cvxpy中将变量堆叠在一起?

时间:2017-07-20 11:07:06

标签: python mathematical-optimization cvxpy

我想使用cvxpy解决优化问题。 假设我想使用log_sum_exp函数来构建这样的约束:

m >= log(1 + exp(m+z))

cvxpy的语法允许我创建维度x = [z,m]的向量变量2并应用矩阵乘法来创建表达式0, z+m的向量:

import cvxpy
x = cvxpy.Variable(2)
coeff = np.array([
    [0,0],
    [1,1]
])
constraints = [ x[1] >= cvxpy.log_sum_exp(coeff * x)]

当像这样编码时,我失去了逻辑的某些部分,因为我想要变量数组的不同部分使用不同的名称。有没有办法更明确地使用log_sum_exp转换,比如

z = cvxpy.Variable()
m = cvxpy.Variable()
constraints = [ m >= cvxpy.log_sum_exp([0, m+z]) ]

我在官方文档中找不到任何提示。谢谢!

1 个答案:

答案 0 :(得分:1)

正如sascha指出的那样,其中一个手册页

Functions in CVXPY

包含答案。特别是,我可以举例说明在没有矩阵乘法的情况下使用log_sum_exp。请注意,仅使用运算符explog在DCP(规范凸编程)框架内构造正确的问题是不可能的,因为您将获得应用于凸函数的凹函数,这被视为未定义的行为。应该使用内置构造函数。

如果要编码约束

F0 >= log( exp(F1) + exp(F2) + ... + exp(Fn) )

其中F1F2,...,Fn是一些凸表达式,F0是凹表达式, 然后可以输入

而不是引入松弛变量
import cvxpy

... # Define variables and functions

constraints = [
    ...,
    something >= cvxpy.log_sum_exp(
        cvxpy.vstack(
            F1,
            F2,
            ...,
            Fn
        )
    )
]

... # Solve the optimisation problem

请注意,vstack可以在多参数样式中使用:

cvxpy.vstack(z, u)

以列表式(但不是元组)

cvxpy.vstack([z,u])