Экстраполяция данных , имеющих разбросов

Факторы, которые влияют на точность экстраполяции

scatteredInterpolant предоставляет функциональность для аппроксимации значений в точках, которые падают за пределы выпуклой оболочки. The '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. The axes 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. The axes contains an object of type line.

Дискретизируйте параболическую функцию, v(x,y), в обоих наборах точек.

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

Создайте scatteredInterpolant для каждой выборки v(x,y).

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. The axes contains an object of type surface.

Оценка F2 и постройте график результатов.

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

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

Качество экстраполяции не так хорошо для F2 из-за грубой выборки точек в v2.

Экстраполяция 3-D данных

В этом примере показано, как экстраполировать хорошо выбранный 3-D сетчатый набор данных с помощью 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. The axes contains an object of type surface.

Экстраполяция вернула хорошие результаты, потому что функция хорошо выбрана.