Dynamic-Calibration/utils/YALMIP-master/extras/pennonm_callback_dg.m

66 lines
1.3 KiB
Matlab
Executable File

function [nnz,ind,val] = pennonm_callback_dg(i,x,model_in)
global latest_G
global latest_g
global latest_x_g
persistent model
persistent G
if nargin>2
model = model_in;
return
end
x = x(:);
if ~isequal(latest_x_g,x)
% Compute the nonlinear terms in the constraints
[g,geq,dg,dgeq] = fmincon_con(x,model);
latest_x_g = x;
% Append with linear constraints
g = [g;geq];
if ~isempty(model.A)
g = [g;model.A*x - model.b];
end
if ~isempty(model.Aeq)
g = [g;model.Aeq*x - model.beq];
end
% Append with linear terms
G = [dg';dgeq'];
if ~isempty(model.A)
G = [G;model.A];
end
if ~isempty(model.Aeq)
G = [G;model.Aeq];
end
start = length(x) - sum((model.K.s).*(model.K.s+1)/2)+1;
for j = 1:length(model.K.s)
ni = model.K.s(j);
T = ones(ni);T = triu(T);
Ti = find(triu(T));
xs = x(start:start+ni*(ni+1)/2-1);
T = T*0;
T(Ti)=xs;
X = T+T'-diag(diag(T));
start = start + ni*(ni+1)/2;
end
[cc,cg] = detfun(X,6);
G(end+1,1)=0;
g(end+1)=0;
latest_G = G;
latest_g = g;
else
G = latest_G;
end
Gi = G(i+1,:);
[aux,ind,val] = find(Gi);
nnz = length(val);