55 lines
1.9 KiB
Mathematica
55 lines
1.9 KiB
Mathematica
|
|
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
|