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

55 lines
1.9 KiB
Matlab
Executable File

function [w,F,DefinedMonoms] = recdef(pow,F,DefinedMonoms,setinitials);
% Recursively define monomial x(pow(1))*x(pow(2))*x(pow(3))..
% using a set of linear variables and bilinear constraints
switch length(pow)
case 1
% Just a linear variable, no constraints needed
w = recover(pow);
case 2
% Quadratic
w = sdpvar(1,1);
xx = prod(recover(pow));
if setinitials
assign(w,double(xx));%prod(recover(pow))));
end
F = F + (xx == w);
otherwise
% FIX: special case x^3, implemented just to
% speed up a particular simulation I had to run.
% This whole file should be revised, booring
if (nnz(diff(pow)) == 0) & length(pow) == 3
x = recover(pow(1));
y = sdpvar(1,1);
w = sdpvar(1,1);
dx = double(x);
assign([w y],[dx^3 dx^2]);
DefinedMonoms(end+1).power = [pow(1:2)];
DefinedMonoms(end).variable = getvariables(y);
DefinedMonoms(end+1).power = [pow(3) getvariables(y)];
DefinedMonoms(end).variable = getvariables(w);
F = F + (x*x == y) + (x*y == w);
return
end
i = 1;
found = 0;
while ~found & i <= length(DefinedMonoms)
if isequal(pow,DefinedMonoms(i).power)
w = recover(DefinedMonoms(i).variable);
return
end
i = i + 1;
end
pow1 = pow(1:floor(length(pow)/2));
pow2 = pow(1+floor(length(pow)/2):end);
[w1,F,DefinedMonoms] = recdef(pow1,F,DefinedMonoms,setinitials);
[w2,F,DefinedMonoms] = recdef(pow2,F,DefinedMonoms,setinitials);
w = sdpvar(1,1);
w1w2 = w1*w2;
F = F + (w1w2 == w);
if setinitials
assign(w,double(w1w2));
end
DefinedMonoms(end+1).power = pow;
DefinedMonoms(end).variable = getvariables(w);
end