[37] | 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.3 2004/07/02 08:17:29 johanl 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 |
---|