Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python cvxpy:将非线性约束转换为等效线性约束_Python_Cvxpy_Convex Optimization - Fatal编程技术网

Python cvxpy:将非线性约束转换为等效线性约束

Python cvxpy:将非线性约束转换为等效线性约束,python,cvxpy,convex-optimization,Python,Cvxpy,Convex Optimization,上下文:我是python公文包优化库的开发人员,我试图允许用户为最大夏普比率问题添加约束 目前,用户可以将其约束作为lambda函数传递,例如使所有权重大于1%: ef=EfficientFrontier(mu,S)#mu和S是预期收益和协方差 ef.add_约束(lambda w:w>=0.01)#示例新约束 ef.min_volatility()#使用约束进行优化 在后端,我将一个cvxpy变量w=cp.variable(n)传递给constraint lambda函数,以创建一个有效的c

上下文:我是python公文包优化库的开发人员,我试图允许用户为最大夏普比率问题添加约束

目前,用户可以将其约束作为lambda函数传递,例如使所有权重大于1%:

ef=EfficientFrontier(mu,S)#mu和S是预期收益和协方差
ef.add_约束(lambda w:w>=0.01)#示例新约束
ef.min_volatility()#使用约束进行优化
在后端,我将一个cvxpy变量
w=cp.variable(n)
传递给constraint lambda函数,以创建一个有效的cvxpy约束,然后将其传递给
cp.Problem
并解决它

我遇到的问题是,最大化夏普比率需要进行变量替换。形式为
Ax~b
(其中
~
表示相等或不相等)的约束必须变为
Ax~k*b
,其中
k
为非负优化变量

我尝试的一件事是将
w/k
传递到lambda函数中。这将导致一个约束
w/k>=0.01
,我希望这个约束等同于
w>=k*0.01
,但遗憾的是,这会给出:

dcperor:问题不符合DCP规则。明确地:
以下约束不适用于DCP:
0.01=0.01)
并将其乘以
k
得到
k*constr=(w>=0.01*k)
,但不能在cvxpy中乘以约束

TL;DR:如何将表示
w/k>=0.01
的cvxpy约束对象(已实例化)转换为表示
w>=k*0.01
的cvxpy约束对象?

否则,我有没有办法重新设计?我想保留lambda函数API

也许有一些API用于分解已经实例化的约束,以便我可以放入变量

约束是设计不变的。不变性简化了CVXPY的大部分逻辑

为什么不构造一个新的约束?您当然可以检查约束的左侧和右侧。现在,这可以通过检查
args
属性来完成(请参阅)