46 lines
1.1 KiB
Mathematica
46 lines
1.1 KiB
Mathematica
|
|
function [A,b] = pwamodel(F,x)
|
||
|
|
|
||
|
|
[dummy,aux,s,model] = export(F,[]);
|
||
|
|
|
||
|
|
A = -model.F_struc(:,2:end);
|
||
|
|
b = model.F_struc(:,1);
|
||
|
|
|
||
|
|
keep_these = find(ismember(aux.used_variables,getvariables(x)));
|
||
|
|
|
||
|
|
A = [A(:,keep_these) A(:,setdiff(1:size(A,2),keep_these))];
|
||
|
|
[A,b] = fourier_motzkin(A,b,length(keep_these));
|
||
|
|
|
||
|
|
function [A,b] = fourier_motzkin(A,b,m)
|
||
|
|
|
||
|
|
while size(A,2)>m
|
||
|
|
[A,b] = fourier_motzkin_1(A,b,m);
|
||
|
|
[aux,i] = unique([A b],'rows');
|
||
|
|
A = A(i,:);
|
||
|
|
b = b(i);
|
||
|
|
end
|
||
|
|
|
||
|
|
function [Aout,bout] = fourier_motzkin_1(A,b,m)
|
||
|
|
|
||
|
|
for i = m+1:size(A,2)
|
||
|
|
less = find(A(:,i)>0);
|
||
|
|
larger = find(A(:,i)<0);
|
||
|
|
t(i-m) =length(less)*length(larger);
|
||
|
|
end
|
||
|
|
|
||
|
|
[minn,remove] = min(t);
|
||
|
|
remove = remove+m;
|
||
|
|
keep = setdiff(1:size(A,2),remove);
|
||
|
|
|
||
|
|
less = find(A(:,remove)>0);
|
||
|
|
larger = find(A(:,remove)<0);
|
||
|
|
notinvolved = find(A(:,remove)==0);
|
||
|
|
|
||
|
|
Aout = A(notinvolved,keep);
|
||
|
|
bout = b(notinvolved);
|
||
|
|
|
||
|
|
for i = 1:length(less)
|
||
|
|
for j = 1:length(larger)
|
||
|
|
Aout = [Aout;A(less(i),keep)/abs(A(less(i),remove)) + A(larger(j),keep)/abs(A(larger(j),remove))];
|
||
|
|
bout = [bout;b(less(i))+b(larger(j))];
|
||
|
|
end
|
||
|
|
end
|