Main Content

外插散点数据

影响外插准确性的因素

scatteredInterpolant 提供了对凸包外部的点求近似解值的功能。'linear' 外插方法基于凸包边界处梯度的最小二乘逼近。为凸包外部的查询点返回的值基于边界处的值和梯度。解的质量取决于数据采样的方式。如果是粗略数据采样,则外插的质量较差。

此外,靠近凸包边界的三角剖分可能具有条形三角形。这些三角形会影响外插结果,就像会影响插值结果一样。有关详细信息,请参阅凸包附近的插值结果效果不佳

应利用您对域外部行为的知识直观检查外插结果。

比较粗略采样和精细采样的散点数据的外插

本示例显示如何插入相同抛物线函数的两种不同采样。此示例说明更佳的采样点分布可以生成更好的外插结果。

围绕 10 个同心圆创建间距为 10 度的径向分布点。使用 bsxfun 计算坐标 x=cosθy=sinθ

theta = 0:10:350;
c = cosd(theta);
s = sind(theta);
r = 1:10;

x1 = bsxfun(@times,r.',c);
y1 = bsxfun(@times,r.',s);

figure
plot(x1,y1,'*b')
axis equal

Figure contains an axes object. The axes object contains 36 objects of type line.

创建第二个更粗略分布的点集。使用 rand 函数在范围 [-10, 10] 中创建随机采样。

rng default;
x2 = -10 + 20*rand([25 1]);
y2 = -10 + 20*rand([25 1]);
figure
plot(x2,y2,'*')

Figure contains an axes object. The axes object contains an object of type line.

在两个点集处对抛物线函数 v(x,y) 采样。

v1 = x1.^2 + y1.^2;
v2 = x2.^2 + y2.^2;

针对 v(x,y) 的每个采样创建 scatteredInterpolant

F1 = scatteredInterpolant(x1(:),y1(:),v1(:));
F2 = scatteredInterpolant(x2(:),y2(:),v2(:));

创建将扩展到每个域外部的查询点网格。

[xq,yq] = ndgrid(-20:20);

计算 F1 并绘制结果。

figure
vq1 = F1(xq,yq);
surf(xq,yq,vq1)

Figure contains an axes object. The axes object contains an object of type surface.

计算 F2 并绘制结果。

figure
vq2 = F2(xq,yq);
surf(xq,yq,vq2)

Figure contains an axes object. The axes object contains an object of type surface.

由于对 v2 中的点进行了粗略采样,F2 的外插质量不佳。

三维数据外插

此示例说明如何使用 scatteredInterpolant 对良好采样的三维网格数据集进行外插。查询点位于完全处于域外部的平面网格上。

创建采样点的 10×10×10 网格。每个维度中的点都处于范围 [-10, 10] 中。

[x,y,z] = ndgrid(-10:10);

在采样点处对函数 v(x,y,z) 采样。

v = x.^2 + y.^2 + z.^2;

创建 scatteredInterpolant,并指定线性插值和外插。

F = scatteredInterpolant(x(:),y(:),z(:),v(:),'linear','linear');

计算 x-y 网格中跨 [-20,20] 范围并且仰角为 z =15 时的插值。

[xq,yq,zq] = ndgrid(-20:20,-20:20,15);
vq = F(xq,yq,zq);
figure
surf(xq,yq,vq)

Figure contains an axes object. The axes object contains an object of type surface.

由于对函数进行了良好采样,外插返回较佳结果。