59 lines
2.4 KiB
Mathematica
59 lines
2.4 KiB
Mathematica
|
|
function [f,df] = sqplab_fun(x)
|
||
|
|
|
||
|
|
global SQPLABDATA
|
||
|
|
|
||
|
|
xevaled = zeros(1,length(SQPLABDATA.interfacedata.c));
|
||
|
|
xevaled(SQPLABDATA.linearindicies) = x;
|
||
|
|
|
||
|
|
% Experimental support for arbitrary functions
|
||
|
|
if SQPLABDATA.evalinobjective
|
||
|
|
if SQPLABDATA.monominobjective
|
||
|
|
if ~isempty(SQPLABDATA.bilinears)
|
||
|
|
xevaled(SQPLABDATA.bilinears(:,1)) = xevaled(SQPLABDATA.bilinears(:,2)).*xevaled(SQPLABDATA.bilinears(:,3));
|
||
|
|
else
|
||
|
|
xevaled(SQPLABDATA.nonlinearindicies) = prod(repmat(xevaled,length(SQPLABDATA.nonlinearindicies),1).^SQPLABDATA.monomtable(SQPLABDATA.nonlinearindicies,:),2);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
for i = 1:length(SQPLABDATA.interfacedata.evalMap)
|
||
|
|
arguments = SQPLABDATA.evalMap{i}.prearg;
|
||
|
|
arguments{2} = xevaled(SQPLABDATA.interfacedata.evalMap{i}.variableIndex);
|
||
|
|
xevaled(SQPLABDATA.interfacedata.evalVariables(i)) = feval(arguments{:});
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if SQPLABDATA.monominobjective
|
||
|
|
if ~isempty(SQPLABDATA.bilinears)
|
||
|
|
xevaled(SQPLABDATA.bilinears(:,1)) = xevaled(SQPLABDATA.bilinears(:,2)).*xevaled(SQPLABDATA.bilinears(:,3));
|
||
|
|
else
|
||
|
|
xevaled(SQPLABDATA.nonlinearindicies) = prod(repmat(xevaled,length(SQPLABDATA.nonlinearindicies),1).^SQPLABDATA.monomtable(SQPLABDATA.nonlinearindicies,:),2);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
xevaled = xevaled(:);
|
||
|
|
if SQPLABDATA.SimpleLinearObjective
|
||
|
|
f = SQPLABDATA.interfacedata.c'*xevaled;
|
||
|
|
else
|
||
|
|
f = (SQPLABDATA.interfacedata.c'+xevaled'*SQPLABDATA.interfacedata.Q)*xevaled;
|
||
|
|
end
|
||
|
|
|
||
|
|
if SQPLABDATA.SimpleLinearObjective
|
||
|
|
df = SQPLABDATA.interfacedata.c(SQPLABDATA.linearindicies);
|
||
|
|
elseif SQPLABDATA.SimpleQuadraticObjective
|
||
|
|
df = SQPLABDATA.interfacedata.c(SQPLABDATA.linearindicies) + 2*SQPLABDATA.interfacedata.Q(SQPLABDATA.linearindicies,SQPLABDATA.linearindicies)*x;
|
||
|
|
elseif SQPLABDATA.SimpleNonlinearObjective
|
||
|
|
df = [];
|
||
|
|
for i = 1:length(SQPLABDATA.linearindicies)
|
||
|
|
xevaled = zeros(1,length(SQPLABDATA.interfacedata.c));
|
||
|
|
xevaled(SQPLABDATA.linearindicies) = x;
|
||
|
|
mt = SQPLABDATA.monomtable;
|
||
|
|
oldpower = mt(:,SQPLABDATA.linearindicies(i));
|
||
|
|
mt(:,SQPLABDATA.linearindicies(i)) = mt(:,SQPLABDATA.linearindicies(i))-1;
|
||
|
|
xevaled = prod(repmat(xevaled,size(mt,1),1).^mt,2);
|
||
|
|
xevaled = xevaled(:)'.*oldpower';xevaled(isnan(xevaled))=0;
|
||
|
|
df = [df;SQPLABDATA.interfacedata.c'*xevaled'];
|
||
|
|
end
|
||
|
|
df = df + 2*SQPLABDATA.interfacedata.Q(SQPLABDATA.linearindicies,SQPLABDATA.linearindicies)*x;
|
||
|
|
else
|
||
|
|
df = [];
|
||
|
|
end
|