如何在cvxpy中将变量堆叠在一起?
How to stack variables together in cvxpy?
我想使用 cvxpy
解决优化问题。
假设我想使用 log_sum_exp
函数来构建这样的约束:
m >= log(1 + exp(m+z))
cvxpy
的语法允许我创建维度 2
的向量变量 x = [z,m]
并应用矩阵乘法来创建表达式向量 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]) ]
?
我在官方文档中找不到任何提示。谢谢!
正如 sascha 指出的那样,手册页之一
包含答案。特别是,我可以举一个不使用矩阵乘法的 log_sum_exp
的例子。请注意,仅使用运算符 exp
和 log
不可能在 DCP(有纪律的凸编程)框架内构建正确的问题,因为您将获得应用于凸函数的凹函数,这被认为是未定义的行为.应该改用内置构造函数。
如果要对约束进行编码
F0 >= log( exp(F1) + exp(F2) + ... + exp(Fn) )
其中F1
, F2
, ..., 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])
我想使用 cvxpy
解决优化问题。
假设我想使用 log_sum_exp
函数来构建这样的约束:
m >= log(1 + exp(m+z))
cvxpy
的语法允许我创建维度 2
的向量变量 x = [z,m]
并应用矩阵乘法来创建表达式向量 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]) ]
?
我在官方文档中找不到任何提示。谢谢!
正如 sascha 指出的那样,手册页之一
包含答案。特别是,我可以举一个不使用矩阵乘法的 log_sum_exp
的例子。请注意,仅使用运算符 exp
和 log
不可能在 DCP(有纪律的凸编程)框架内构建正确的问题,因为您将获得应用于凸函数的凹函数,这被认为是未定义的行为.应该改用内置构造函数。
如果要对约束进行编码
F0 >= log( exp(F1) + exp(F2) + ... + exp(Fn) )
其中F1
, F2
, ..., 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])