目录
影响外插准确性的因素
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
如图所示:
创建第二个更粗略分布的点集。使用 rand 函数在范围 [-10, 10] 中创建随机采样。
rng default;
x2 = -10 + 20*rand([25 1]);
y2 = -10 + 20*rand([25 1]);
figure
plot(x2,y2,'*')
如图所示:
在两个点集处对抛物线函数 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)
如图所示:
计算 F2 并绘制结果。
figure
vq2 = F2(xq,yq);
surf(xq,yq,vq2)
如图所示:
由于对 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)
如图所示:
由于对函数进行了良好采样,外插返回较佳结果。