[37] | 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 | |
---|