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.