1 | function [Fconv,info] = nonlineartocone(F) |
---|
2 | %NONLINEARTOCONE Convert nonlinear constraint to second order cone |
---|
3 | |
---|
4 | % Author Johan Löfberg |
---|
5 | % $Id: nonlineartocone.m,v 1.1 2006/08/10 18:00:21 joloef Exp $ |
---|
6 | |
---|
7 | if islinear(F) |
---|
8 | Fconv = F; |
---|
9 | info = 0; |
---|
10 | return |
---|
11 | end |
---|
12 | |
---|
13 | [n,m]=size(F); |
---|
14 | if (n*m==1) |
---|
15 | Fconv = []; |
---|
16 | % Involved in polynomial constraints |
---|
17 | sqrList = yalmip('nonlinearvariables'); |
---|
18 | h = sort(unique(sqrList)); |
---|
19 | % % SDP relaxation |
---|
20 | for i = 1:size(sqrList,1) |
---|
21 | left_index = find(h==sqrList(i,1)); |
---|
22 | x1_index = find(h==sqrList(i,2)); |
---|
23 | x2_index = find(h==sqrList(i,3)); |
---|
24 | Z{i}=zeros(length(h),length(h)); |
---|
25 | if x1_index==x2_index |
---|
26 | Z{i}(x2_index,x1_index) = 1; |
---|
27 | else |
---|
28 | Z{i}(x1_index,x2_index) = 0.5; |
---|
29 | Z{i}(x2_index,x1_index) = 0.5; |
---|
30 | end |
---|
31 | end |
---|
32 | vars = getvariables(F); |
---|
33 | base = getbase(F); |
---|
34 | nonlinvars = find(ismember(vars,sqrList(:,1))); |
---|
35 | linvars = find(~ismember(vars,sqrList(:,1))); |
---|
36 | % Construct quadratic |
---|
37 | Q = zeros(length(h)); |
---|
38 | for i = 1:length(nonlinvars) |
---|
39 | indexinlist = find(vars(nonlinvars(i))==sqrList(:,1)); |
---|
40 | indexinh = find(vars(nonlinvars(i))==h); |
---|
41 | Q = Q-Z{indexinlist}*base(1+find(h(indexinh)==vars)); |
---|
42 | end |
---|
43 | used = find(any(Q)); |
---|
44 | [B,r] = chol(Q(used,used)); |
---|
45 | if r==0 |
---|
46 | linear = base(1); |
---|
47 | if ~isempty(linvars) |
---|
48 | linear = linear+base(1+find(ismember(linvars,vars)))*recover(linvars); |
---|
49 | end |
---|
50 | ConesAxb=[2*B*recover(h(used));1-linear]; |
---|
51 | Conescxd=1+linear; |
---|
52 | Fconv = cone(ConesAxb,Conescxd); |
---|
53 | info = 0; |
---|
54 | else |
---|
55 | Fconv = F; |
---|
56 | if nargout == 2 |
---|
57 | info = 1; |
---|
58 | else |
---|
59 | warning('Cannot re-write to second order cone constraint'); |
---|
60 | end |
---|
61 | end |
---|
62 | else |
---|
63 | if nargout == 2 |
---|
64 | Fconv = F; |
---|
65 | info = 1; |
---|
66 | else |
---|
67 | error('nonlineartocone can only be applied to scalar inequalities') |
---|
68 | end |
---|
69 | end |
---|