散布データの外挿
外挿の精度に影響を与える要因
scatteredInterpolant
は凸包の外部の点における値を近似する機能を提供します。'linear'
外挿メソッドは、凸包の境界における勾配の最小二乗近似を基にしています。凸包の外にあるクエリ点に対して返される値は、境界での値と勾配を基にしています。解の質はデータのサンプル方法の良否によって変化します。データのサンプリング点が荒いと、外挿の質が劣ります。
さらに、凸包境界の近傍での三角形分割では、細長い小片のような三角形になることがあります。こうした三角形が形成されると、内挿の結果と同様に、外挿の結果も良好でない可能性があります。詳細は、内挿の結果が凸包の近傍で不適切を参照してください。
領域外の動作に関する知識を活用して、可視化された外挿結果を検証してください。
散布データのサンプリングが粗い場合と細かい場合の外挿の比較
この例では、同じ放物線関数から得た 2 つの異なるサンプリングを内挿する方法を示します。また、サンプル点の分布が良好になると外挿の結果も良くなることも示します。
10 個の同心円の周囲に、10 度ずつ離れた点を放射状に分布して作成します。bsxfun
を使用して、座標 および を計算します。
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
さらに粗く分布した 2 つ目の点集合を作成します。関数 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)
F2
では v2
のサンプリング点が粗いため、外挿の質が劣っています。
3 次元データの外挿
この例では、scatteredInterpolant
を使用して、良好にサンプリングされた 3 次元グリッド データセットを外挿する方法を説明します。クエリ点は完全に領域外の平面グリッド上にあります。
10 x 10 x 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');
高度 z = 15 を指定し、[-20, 20] の範囲に広がる x-y グリッド上で内挿を評価します。
[xq,yq,zq] = ndgrid(-20:20,-20:20,15); vq = F(xq,yq,zq); figure surf(xq,yq,vq)
関数のサンプリングが良好なので、外挿の結果も良好です。