1 | function [g,geq,dg,dgeq] = fmincon_con(x,params) |
---|
2 | |
---|
3 | % Early bail for linear problems |
---|
4 | if params.linearconstraints%isempty(params.interfacedata.evalMap) & isempty(params.interfacedata.Anonlinineq) & isempty(params.interfacedata.Anonlineq) & isequal( params.interfacedata.K.q,0) & isequal( params.interfacedata.K.s,0) |
---|
5 | g = []; |
---|
6 | geq = []; |
---|
7 | return |
---|
8 | end |
---|
9 | |
---|
10 | xevaled = zeros(1,length(params.interfacedata.c)); |
---|
11 | xevaled(params.linearindicies) = x; |
---|
12 | |
---|
13 | % Experimental support for arbitrary functions |
---|
14 | % nonlinear expressions inside sin() exp() etc |
---|
15 | if ~isempty(params.interfacedata.evalMap) |
---|
16 | pp = params.monomtable(params.nonlinearindicies,:); |
---|
17 | xevaled(params.nonlinearindicies) = prod(repmat(xevaled,length(params.nonlinearindicies),1).^pp,2); |
---|
18 | |
---|
19 | for i = 1:length(params.interfacedata.evalMap) |
---|
20 | arguments = {params.interfacedata.evalMap{i}.fcn,xevaled(params.interfacedata.evalMap{i}.variableIndex)}; |
---|
21 | arguments = {arguments{:},params.interfacedata.evalMap{i}.arg{2:end-1}}; |
---|
22 | xevaled(params.interfacedata.evalVariables(i)) = feval(arguments{:}); |
---|
23 | end |
---|
24 | end |
---|
25 | pp = params.monomtable(params.nonlinearindicies,:); |
---|
26 | xevaled(params.nonlinearindicies) = prod(repmat(xevaled,length(params.nonlinearindicies),1).^pp,2); |
---|
27 | |
---|
28 | if params.nonlinearinequalities |
---|
29 | g = params.interfacedata.Anonlinineq*xevaled(:)-params.interfacedata.bnonlinineq; |
---|
30 | else |
---|
31 | g = []; |
---|
32 | end |
---|
33 | |
---|
34 | if params.nonlinearequalities |
---|
35 | geq = params.interfacedata.Anonlineq*xevaled(:)-params.interfacedata.bnonlineq; |
---|
36 | else |
---|
37 | geq = []; |
---|
38 | end |
---|
39 | |
---|
40 | K = params.interfacedata.K; |
---|
41 | top = 1; |
---|
42 | if K.q(1) > 0 |
---|
43 | for i = 1:length(K.q) |
---|
44 | Axcd = params.interfacedata.F_struc(top:top+K.q(i)-1,:)*[1;xevaled(:)]; |
---|
45 | g = [g;-(Axcd(1)^2-norm(Axcd(2:end),2)^2)]; |
---|
46 | top = top + K.q(i); |
---|
47 | end |
---|
48 | end |
---|
49 | if K.s(1) > 0 |
---|
50 | for i = 1:length(K.s) |
---|
51 | CminusA = params.interfacedata.F_struc(top:top+K.s(i)^2-1,:)*[1;xevaled(:)]; |
---|
52 | CminusA = reshape(CminusA,K.s(i),K.s(i)); |
---|
53 | [R,p] = chol(CminusA); |
---|
54 | if p |
---|
55 | g = [g;-min(eig(CminusA))]; |
---|
56 | else |
---|
57 | g = [g;-log(det(CminusA))]; |
---|
58 | end |
---|
59 | top = top + K.s(i)^2; |
---|
60 | end |
---|
61 | end |
---|
62 | |
---|
63 | % |
---|
64 | % dg = []; |
---|
65 | % dgeq = []; |
---|
66 | % if params.SimpleNonlinearConstraints |
---|
67 | % dg = []; |
---|
68 | % allA = [params.interfacedata.Anonlineq;params.interfacedata.Anonlinineq]; |
---|
69 | % for i = 1:length(params.linearindicies) |
---|
70 | % xevaled = zeros(1,length(params.interfacedata.c)); |
---|
71 | % xevaled(params.linearindicies) = x; |
---|
72 | % mt = params.monomtable; |
---|
73 | % oldpower = mt(:,params.linearindicies(i)); |
---|
74 | % mt(:,params.linearindicies(i)) = mt(:,params.linearindicies(i))-1; |
---|
75 | % xevaled = prod(repmat(xevaled,size(mt,1),1).^mt,2); |
---|
76 | % xevaled = xevaled(:)'.*oldpower';xevaled(isnan(xevaled))=0; |
---|
77 | % dg = [dg allA*xevaled']; |
---|
78 | % end |
---|
79 | % dgeq = dg(1:size(params.interfacedata.Anonlineq,1),:)'; |
---|
80 | % dg = dg(size(params.interfacedata.Anonlineq,1)+1:end,:)'; |
---|
81 | % %full(dgeq') |
---|
82 | % end |
---|
83 | |
---|
84 | % |
---|
85 | % dg = []; |
---|
86 | % dgeq = []; |
---|
87 | % if params.SimpleNonlinearConstraints |
---|
88 | % dg = []; |
---|
89 | % allA = [params.interfacedata.Anonlineq;params.interfacedata.Anonlinineq]; |
---|
90 | % mt = params.monomtable; |
---|
91 | % xe = zeros(1,length(params.interfacedata.c)); |
---|
92 | % xe(params.linearindicies) = x; |
---|
93 | % xx = xe; |
---|
94 | % xe = repmat(xe,size(mt,1),1).^mt; |
---|
95 | % |
---|
96 | % for i = 1:length(params.linearindicies) |
---|
97 | % % xevaled = zeros(1,length(params.interfacedata.c)); |
---|
98 | % % xevaled(params.linearindicies) = x; |
---|
99 | % |
---|
100 | % oldpower = mt(:,params.linearindicies(i)); |
---|
101 | % newpower = oldpower-1; |
---|
102 | % % mt(:,params.linearindicies(i)) = mt(:,params.linearindicies(i))-1; |
---|
103 | % xevaled = xe;xevaled(params.linearindicies(i),:) = xx(params.linearindicies(i),:) |
---|
104 | % xevaledparams.linearindicies(i)) = xevaled(params.linearindicies(i),:).^newpower'; |
---|
105 | % xevaled = prod(xevaled,2); |
---|
106 | % xevaled = xevaled(:)'.*oldpower';xevaled(isnan(xevaled))=0; |
---|
107 | % dg = [dg allA*xevaled']; |
---|
108 | % end |
---|
109 | % dgeq = dg(1:size(params.interfacedata.Anonlineq,1),:)'; |
---|
110 | % dg = dg(size(params.interfacedata.Anonlineq,1)+1:end,:)'; |
---|
111 | % full(dgeq) |
---|
112 | % end |
---|
113 | % |
---|
114 | |
---|
115 | |
---|
116 | |
---|