下载与安装
http://cvxr.com/cvx/download/
可以选择前两个中的一个
解压到想安装的地方
然后
打开matlab,cd进去
cd xxx
cvx_setup
结果是这样
然后可以测试一下
m = 20; n = 10; p = 4;
A = randn(m,n); b = randn(m,1);
C = randn(p,n); d = randn(p,1); e = rand;
cvx_begin
variable x(n)
minimize( norm( A * x - b, 2 ) )
subject to
C * x == d
norm( x, Inf ) <= e
cvx_end
使用
基本框架
cvx_begin
{variables declaration}
minimize({objective function}) or maximize{{objective function})
subject to
{constraints}
cvx_end
cvx只支持凸函数作为目标函数和约束函数
函数 | 含义 | 性质 |
---|---|---|
norm | ∥ x ∥ p ( p ≥ 1 ) \|x\|_p(p\ge1) ∥x∥p(p≥1) | 凸 |
square(x) | x 2 x^2 x2 | 凸 |
sum_square(x) | ∑ i = 1 n x i 2 \sum_{i=1}^{n}x_i^2 ∑i=1nxi2 | 凸 |
square_pos(x) | [ x ] + 2 [x]_{+}^2 [x]+2 | 凸,单调不减 |
sqrt(x) | x \sqrt{x} x | 凸,单调不减 |
inv_pos(x) | 1 x ( x > 0 ) \frac{1}{x}(x>0) x1(x>0) | 凸,单调不减 |
max(x) | max { x 1 , ⋯ , x n } \max\left\{x_1,\cdots,x_n\right\} max{x1,⋯,xn} | 凸,单调不减 |
quad_over_lin(x,y) | ∥ x ∥ 2 y ( y > 0 ) \frac{\|x\|^2}{y}(y>0) y∥x∥2(y>0) | 凸 |
quad_form(x,P) | x T P x ( P ≻ 0 ) x^TPx(P\succ0) xTPx(P≻0) | 凸 |
约束里,
f(x)<=g(x)
g(x)>=f(x)
其中要求f是凸的,g是凹的
然后
h(x)==s(x)
其中要求h和s都得是仿射函数
例子
最小二乘
min ∥ A x − b ∥ 2 \min \|\mathbf{Ax}-\mathbf{b}\|^2 min∥Ax−b∥2
A=[1,2;3,4;5,6];b=[7;8;9];
正常解:
x=(A'*A)\(A'*b)
第一种解法
cvx_begin
variable x(2)
minimize(sum_square(A*x-b))
cvx_end
然后输出一下
x
第二种
A=[1,2;3,4;5,6];b=[7;8;9];
cvx_begin
variable x(2)
minimize(quad_form(x,A'*A)-2*b'*A*x)
cvx_end
然后输出一下
x
错误解法
cvx_begin
variable x(2)
minimize(norm(A*x-b)^2)
cvx_end
正确解法
cvx_begin
variable x(2)
minimize(square_pos(norm(A*x-b)))
cvx_end
例2
min x 1 2 + x 2 2 + 1 + 2 max { x 1 , x 2 , 0 } s.t. ∣ x 1 ∣ + ∣ x 2 ∣ + x 1 2 x 2 ≤ 5 1 x 2 + x 1 4 ≤ 10 x 2 ≥ 1 x 1 ≥ 0 \begin{array}{ll} \min & \sqrt{x_{1}^{2}+x_{2}^{2}+1}+2 \max \left\{x_{1}, x_{2}, 0\right\} \\ \text { s.t. } & \left|x_{1}\right|+\left|x_{2}\right|+\frac{x_{1}^{2}}{x_{2}} \leq 5 \\ & \frac{1}{x_{2}}+x_{1}^{4} \leq 10\\ & x_2\ge1\\ &x_1\ge 0 \end{array} min s.t. x12+x22+1+2max{x1,x2,0}∣x1∣+∣x2∣+x2x12≤5x21+x14≤10x2≥1x1≥0
cvx_begin
variable x(2)
minimize(norm([x;1])+2*max(max(x(1),x(2)),0))
subject to
norm(x,1)+quad_over_lin(x(1),x(2))<=5
inv_pos(x(2))+x(1)^4<=10
x(2)>=1
x(1)>=0
cvx_end
例子3
min x , r r s.t. ∥ x − a i ∥ ≤ r , i = 1 , 2 , ⋯ , m \begin{array}{ll} \min_{\mathbf{x},r} & r \\ \text { s.t. } & \|\mathbf{x}-\mathbf{a}_i\|\le r,\quad i=1,2,\cdots,m \end{array} minx,r s.t. r∥x−ai∥≤r,i=1,2,⋯,m
A=[-1,-3,-1,5,-1;3,10,0,0,-5];
cvx_begin
variables x(2) r
minimize(r)
subject to
for i=1:5
norm(x-A(:,i))<=r
end
cvx_end
画图
plot(A(1,:),A(2,:),'*')
hold on
plot(x(1),x(2),'d')
t=0:0.001:2*pi;
xx=x(1)+r*cos(t);
yy=x(2)+r*sin(t);
plot(xx,yy);
axis equal;
axis([-11,7,-6,11])
hold off