Hi! Does anyone know how to write x*sqrt(x/y) in cvx? For x >=0, y >0, this should be convex in x and y since it is the perspective function of the convex function sqrt(1/y). Thank you!
My back on the envelope computations shows that
x*sqrt(x/y)<= t
is equivalent to
|x| <= (t^2y)^(1/3)=t^(2/3)*y^(1/3)
t,y>0.0
which is a power cone.
@Erling, I am sorry I am very new to programming in cvx. When I write this constraint in CVX, i get the following error: cannot perform the operation (concave).*(concave). Any idea how to solve this?
I do not think cvx has the power cone, but if you take geometric mean of (t,t,y) you got what you need since
t^1/3 * t^1/3 * y^1/3 >=|x|
Note the LHS is the geometric mean.
So you can use geometric mean cone mentioned at
http://web.cvxr.com/cvx/doc/funcref.html#nonlinear
Most likely you find in the documentation how to use geo_mean_cone.
help geo_mean
geo_mean Geometric mean.
Y=geo_mean(X), where X is a vector, computes the geometrix mean of X. If any
of the elements of X are negative, then Y=-Inf. Otherwise, it is equivalent
to Y=PROD(X).^(1/LENGTH(X)). All elements must be real.For matrices, geo_mean(X) is a row vector containing the geometric means of the columns. For N-D arrays, geo_mean(X) is an array of the geometric means taken along the first non-singleton dimension of X. geo_mean(X,DIM) takes the geometric mean along the dimension DIM of X. geo_mean(X,DIM,W), where W is a vector of nonnegative integers, computes a weighted geometric mean Y = PROD(X.^W)^(1/SUM(W)). This is more efficient than replicating the values of X W times. Note that W must be a vector, even if X is a matrix, and its length must be the same as SIZE(X,DIM). Disciplined convex programming information: geo_mean is concave and nondecreasing; therefore, when used in CVX specifications, its argument must be concave.
@Erling, @Mark_L_Stone. Thank you very much for your replies. I have now written the following code, where I used geo_mean.
cvx_begin
variable x;
variable w(3,1);
minimize(w(1))
subject to
w(1)==w(2);
abs(x) <= geo_mean(w);
x >= 1;
w(3) - 2*x + 1 >= 0;
cvx_end
However, it returns the status: Inaccurate/solved, with optimal value +0.000419713. It is obvious that the optimal value should go to zero in this case. Is something wrong with my code?
I don’t see how you got your formulation. Are you incorporating other constraints?
Nevertheless, by including the following in your CVX program
variables x y t;
abs(x) <= geo_mean([t,t,y]);
x >= 0
y>=0
you can use t
in place of x*sqrt(x/y)
.
The program
cvx_begin
variables x y t;
minimize(t)
subject to
abs(x) <= geo_mean([t,t,y]);
x >= 0
y>=0
cvx_end
results, within solver tolerance, in optimal value of x
and t
both equal to zero, and y
being any positive number.
Adding the constraint x >=
1 makes the problem ill-posed, because the infimum of 0 is achieved (actually, not achieved) in the limit as y \rightarrow \infty. Solvers don’t like that.