155 lines
5.7 KiB
Mathematica
155 lines
5.7 KiB
Mathematica
|
|
function varargout = interp2_internal(varargin)
|
||
|
|
%INTERP2_INTERNAL (overloaded)
|
||
|
|
|
||
|
|
switch class(varargin{1})
|
||
|
|
|
||
|
|
case 'double'
|
||
|
|
if isequal(varargin{5},'graph') || isequal(varargin{5},'lp') || isequal(varargin{5},'milp') || isequal(varargin{5},'sos2')
|
||
|
|
varargout{1} = griddata(varargin{2},varargin{3},varargin{4},varargin{1}(1),varargin{1}(2));
|
||
|
|
return
|
||
|
|
end
|
||
|
|
varargout{1} = interp2(varargin{2},varargin{3},varargin{4},varargin{1}(1),varargin{1}(2),varargin{5});
|
||
|
|
|
||
|
|
case 'char'
|
||
|
|
|
||
|
|
t = varargin{2};
|
||
|
|
x = varargin{3}(1);
|
||
|
|
y = varargin{3}(2);
|
||
|
|
xi = varargin{4};
|
||
|
|
yi = varargin{5};
|
||
|
|
zi = varargin{6};
|
||
|
|
method = varargin{7};
|
||
|
|
|
||
|
|
% YALMIP requests a graph model
|
||
|
|
if isequal(varargin{1},'graph')
|
||
|
|
|
||
|
|
% Are we actually asking for a graph model?
|
||
|
|
if strcmpi(method,'graph') || strcmpi(method,'lp')
|
||
|
|
% Compute hyperplanes if possible
|
||
|
|
[convexconcave,A,B] = isconvexmeshdata(xi,yi,zi);
|
||
|
|
if convexconcave == 1
|
||
|
|
% Data convex, create epi-graph
|
||
|
|
F = [[x y t]*A + B >= 0, min(min(xi)) <= x <= max(max(xi)),min(min(yi)) <= y <= max(max(yi))];
|
||
|
|
mono = 'none';
|
||
|
|
def = 'none';
|
||
|
|
operator = struct('convexity','convex','monotonicity',mono,'definiteness',def,'model','graph');
|
||
|
|
elseif convexconcave == -1
|
||
|
|
% Data concave, create hypograph
|
||
|
|
F = [[x y t]*A + B <= 0, min(min(xi)) <= x <= max(max(xi)),min(min(yi)) <= y <= max(max(yi))];
|
||
|
|
mono = 'none';
|
||
|
|
def = 'none';
|
||
|
|
operator = struct('convexity','concave','monotonicity',mono,'definiteness',def,'model','graph');
|
||
|
|
else
|
||
|
|
% Data is indefinite
|
||
|
|
F = [];
|
||
|
|
operator = [];
|
||
|
|
end
|
||
|
|
else
|
||
|
|
F = [];
|
||
|
|
operator = [];
|
||
|
|
end
|
||
|
|
varargout{1} = F;
|
||
|
|
varargout{2} = operator;
|
||
|
|
varargout{3} = varargin{3};
|
||
|
|
|
||
|
|
else
|
||
|
|
if isequal(varargin{end},'graph')
|
||
|
|
% We want graph, YALMIP asks for exact representation
|
||
|
|
varargout{1} = [];
|
||
|
|
varargout{2} = [];
|
||
|
|
varargout{3} = varargin{3};
|
||
|
|
|
||
|
|
elseif strcmpi(method,'sos2') || strcmpi(method,'milp') || strcmpi(method,'lp')
|
||
|
|
|
||
|
|
xi = varargin{4};
|
||
|
|
yi = varargin{5};
|
||
|
|
zi = varargin{6};
|
||
|
|
[N,M] = size(xi);
|
||
|
|
xy = varargin{3};
|
||
|
|
x = xy(1);
|
||
|
|
y = xy(2);
|
||
|
|
z = varargin{2};
|
||
|
|
|
||
|
|
Lambda = sdpvar(N,M,'full');
|
||
|
|
xinterp = sum(sum(xi.*Lambda));
|
||
|
|
yinterp = sum(sum(yi.*Lambda));
|
||
|
|
zinterp = sum(sum(zi.*Lambda));
|
||
|
|
colsos = sdpvar(M,1,'full');
|
||
|
|
rowsos = sdpvar(N,1,'full');
|
||
|
|
F = [sum(sum(Lambda))==1, Lambda >= 0];
|
||
|
|
F = [F, colsos == sum(Lambda,1)'];
|
||
|
|
F = [F, rowsos == sum(Lambda,2)];
|
||
|
|
F = [F, sos2(colsos), sos2(rowsos)];
|
||
|
|
F = [F, z == sum(sum(Lambda.*zi)),
|
||
|
|
x == sum(sum(Lambda.*xi)),
|
||
|
|
y == sum(sum(Lambda.*yi))];
|
||
|
|
|
||
|
|
Elements = reshape(1:N*M,N,M);
|
||
|
|
for i = -(N+M):N+M
|
||
|
|
j = diag(fliplr(Elements),i);
|
||
|
|
if length(j) >= 3
|
||
|
|
F = [F, sos2(Lambda(j))];
|
||
|
|
end
|
||
|
|
end
|
||
|
|
operator = struct('convexity','none','monotonicity','none','definiteness','none','model','integer');
|
||
|
|
varargout{1} = F;
|
||
|
|
varargout{2} = operator;
|
||
|
|
varargout{3} = varargin{3};
|
||
|
|
|
||
|
|
else
|
||
|
|
L = [min(varargin{4}(:));min(varargin{5}(:))];
|
||
|
|
U = [max(varargin{4}(:));max(varargin{5}(:))];
|
||
|
|
operator = struct('convexity','none','monotonicity','none','definiteness','none','model','callback');
|
||
|
|
operator.bounds = @bounds;
|
||
|
|
varargout{1} = [L <= varargin{3} <= U];
|
||
|
|
varargout{2} = operator;
|
||
|
|
varargout{3} = varargin{3};
|
||
|
|
end
|
||
|
|
end
|
||
|
|
otherwise
|
||
|
|
error('SDPVAR/INTERP2_INTERNAL called with strange argument');
|
||
|
|
end
|
||
|
|
|
||
|
|
function [L,U] = bounds(xL,xU,varargin)
|
||
|
|
|
||
|
|
xv = varargin{1};
|
||
|
|
yv = varargin{2};
|
||
|
|
zv = varargin{3};
|
||
|
|
i = 1;
|
||
|
|
lowindex = zeros(2,1);
|
||
|
|
highindex = zeros(2,1);
|
||
|
|
if xL(1) <= xv(1)
|
||
|
|
lowindex(i) = 1;
|
||
|
|
else
|
||
|
|
temp = find(xL(1) > xv(1,:));lowindex(i) = max(1,max(temp));
|
||
|
|
end
|
||
|
|
if xU(1) >= xv(end)
|
||
|
|
highindex(i) = size(xv,2);
|
||
|
|
else
|
||
|
|
temp = find(xv(1,:) < xU(1));highindex(i) = min(size(xv,2),max(temp)+1);
|
||
|
|
end
|
||
|
|
i = 2;
|
||
|
|
if xL(2) <= yv(1)
|
||
|
|
lowindex(i) = 1;
|
||
|
|
else
|
||
|
|
temp = find(xL(2) > yv(:,1));lowindex(i) = max(1,max(temp));
|
||
|
|
end
|
||
|
|
if xU(2) >= yv(end)
|
||
|
|
highindex(i) = size(yv,1);
|
||
|
|
else
|
||
|
|
temp = find(yv(:,1) < xU(2));highindex(i) = min(size(yv,1),max(temp)+1);
|
||
|
|
end
|
||
|
|
|
||
|
|
if isequal(varargin{4},'linear')
|
||
|
|
Z = zv(lowindex(1):highindex(1),lowindex(2):highindex(2));
|
||
|
|
L = min(Z(:));
|
||
|
|
U = max(Z(:));
|
||
|
|
else
|
||
|
|
dx = (xv(1,highindex(1))-xv(1,lowindex(1)))/(size(xv,2)*25);
|
||
|
|
dy = (yv(highindex(2),1)-yv(lowindex(2),1))/(size(yv,1)*25);
|
||
|
|
[X,Y] = meshgrid(xv(1,lowindex(1)):dx:xv(1,highindex(1)),yv(lowindex(2),1):dy:yv(highindex(2),1));
|
||
|
|
Z = interp2(xv,yv,zv,X,Y,varargin{4});
|
||
|
|
% To account for finite grid, we add a precision dependent margin
|
||
|
|
L = min(Z(:))-dx-dy;
|
||
|
|
U = max(Z(:))+dx+dy;
|
||
|
|
end
|