www.gusucode.com > matlab 案例源码 matlab代码程序 > matlab/InterpolationResultsPoorNearTheConvexHullExample.m

    %% Interpolation Results Poor Near the Convex Hull
% The Delaunay triangulation is well suited to scattered data interpolation problems because it has favorable geometric properties that produce good results. These properties are:
% 
% * The rejection of sliver-shaped triangles/tetrahedra in favor of more equilateral-shaped ones.
% * The empty circumcircle property that implicitly defines a nearest-neighbor relation between the points.
% 
% The empty circumcircle property ensures the
% interpolated values are influenced by sample points in the neighborhood
% of the query location. Despite these qualities, in some situations the
% distribution of the data points may lead to poor results and this
% typically happens near the convex hull of the sample data set. When the
% interpolation produces unexpected results, a plot of the sample data and
% underlying triangulation can often provide insight into the problem.

% Copyright 2015 The MathWorks, Inc.


%%
% This example shows an interpolated surface that deteriorates near the
% boundary.

%% 
% Create a sample data set that will exhibit problems near the boundary.
t = 0.4*pi:0.02:0.6*pi;
x1 = cos(t)';
y1 = sin(t)'-1.02;
x2 = x1;
y2 = y1*(-1);
x3 = linspace(-0.3,0.3,16)';
y3 = zeros(16,1);
x = [x1;x2;x3];
y = [y1;y2;y3];

%%
% Now lift these sample points onto the surface $z = x^{2}+y^{2}$ and interpolate the surface.
z = x.^2 + y.^2;
F = scatteredInterpolant(x,y,z);
[xi,yi] = meshgrid(-0.3:.02:0.3, -0.0688:0.01:0.0688);
zi = F(xi,yi);
mesh(xi,yi,zi)
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Interpolated Surface');

%%
% The actual surface is:
zi = xi.^2 + yi.^2;
figure
mesh(xi,yi,zi)
title('Actual Surface')


%%
% To understand why the interpolating surface deteriorates near the
% boundary, it is helpful to look at the underlying triangulation:
dt = delaunayTriangulation(x,y);
figure
plot(x,y,'*r')
axis equal
hold on
triplot(dt)
plot(x1,y1,'-r')
plot(x2,y2,'-r')
title('Triangulation Used to Create the Interpolant')
hold off

%%
% The triangles within the red boundaries are relatively well shaped; they
% are constructed from points that are in close proximity and the
% interpolation works well in this region. Outside the red boundary, the
% triangles are sliver-like and connect points that are remote from each
% other. There is not sufficient sampling to accurately capture the
% surface, so it is not surprising that the results in these regions are
% poor. In 3-D, visual inspection of the triangulation gets a bit trickier,
% but looking at the point distribution can often help illustrate potential
% problems.


%%
% The MATLAB(R) 4 |griddata| method, |'v4'|, is not triangulation-based
% and is not affected by deterioration of the interpolation surface near
% the boundary.
[xi,yi] = meshgrid(-0.3:.02:0.3, -0.0688:0.01:0.0688);
zi = griddata(x,y,z,xi,yi,'v4');
mesh(xi,yi,zi)
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b')
zlabel('Value - V','fontweight','b')
title('Interpolated surface from griddata with v4 method','fontweight','b');

%%
% The interpolated surface from |griddata| using the |'v4'| method
% corresponds to the expected actual surface.