[37] | 1 | function [f,df] = fmincon_fun(x,params) |
---|
| 2 | |
---|
| 3 | xevaled = zeros(1,length(params.interfacedata.c)); |
---|
| 4 | xevaled(params.linearindicies) = x; |
---|
| 5 | |
---|
| 6 | % Experimental support for arbitrary functions |
---|
| 7 | if ~isempty(params.interfacedata.evalMap) |
---|
| 8 | pp = params.monomtable(params.nonlinearindicies,:); |
---|
| 9 | xevaled(params.nonlinearindicies) = prod(repmat(xevaled,length(params.nonlinearindicies),1).^pp,2); |
---|
| 10 | for i = 1:length(params.interfacedata.evalMap) |
---|
| 11 | arguments = {params.interfacedata.evalMap{i}.fcn,xevaled(params.interfacedata.evalMap{i}.variableIndex)}; |
---|
| 12 | arguments = {arguments{:},params.interfacedata.evalMap{i}.arg{2:end-1}}; |
---|
| 13 | xevaled(params.interfacedata.evalVariables(i)) = feval(arguments{:}); |
---|
| 14 | end |
---|
| 15 | end |
---|
| 16 | |
---|
| 17 | xevaled(params.nonlinearindicies) = prod(repmat(xevaled,length(params.nonlinearindicies),1).^params.monomtable(params.nonlinearindicies,:),2); |
---|
| 18 | |
---|
| 19 | xevaled = xevaled(:); |
---|
| 20 | f = params.interfacedata.c'*xevaled+xevaled'*params.interfacedata.Q*xevaled; |
---|
| 21 | |
---|
| 22 | if params.SimpleLinearObjective |
---|
| 23 | df = params.interfacedata.c(params.linearindicies); |
---|
| 24 | elseif params.SimpleQuadraticObjective |
---|
| 25 | df = params.interfacedata.c(params.linearindicies) + 2*params.interfacedata.Q(params.linearindicies,params.linearindicies)*x; |
---|
| 26 | elseif params.SimpleNonlinearObjective |
---|
| 27 | df = []; |
---|
| 28 | for i = 1:length(params.linearindicies) |
---|
| 29 | xevaled = zeros(1,length(params.interfacedata.c)); |
---|
| 30 | xevaled(params.linearindicies) = x; |
---|
| 31 | mt = params.monomtable; |
---|
| 32 | oldpower = mt(:,params.linearindicies(i)); |
---|
| 33 | mt(:,params.linearindicies(i)) = mt(:,params.linearindicies(i))-1; |
---|
| 34 | xevaled = prod(repmat(xevaled,size(mt,1),1).^mt,2); |
---|
| 35 | xevaled = xevaled(:)'.*oldpower';xevaled(isnan(xevaled))=0; |
---|
| 36 | df = [df;params.interfacedata.c'*xevaled']; |
---|
| 37 | end |
---|
| 38 | df = df + 2*params.interfacedata.Q(params.linearindicies,params.linearindicies)*x; |
---|
| 39 | else |
---|
| 40 | df = []; |
---|
| 41 | end |
---|