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. One or more of the lines displays its values using only markers

创建第二个更粗略分布的点集。使用 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 contains a line object which displays its values using only markers.

在两个点集处对抛物线函数 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.

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