scatteredInterpolant
предоставляет функциональность для аппроксимации значений в точках, которые падают за пределы выпуклой оболочки. The 'linear'
метод экстраполяции основан на приближении градиента методом наименьших квадратов в контур выпуклой оболочки. Значения, которые он возвращает для точек запроса за пределами выпуклой оболочки, основаны на значениях и градиентах в контур. Качество решения зависит от того, насколько хорошо вы отобрали свои данные. Если ваши данные подвергнуты грубой выборке, качество экстраполяции низкое.
В сложение триангуляция около выпуклой оболочки контура может иметь скользкообразные треугольники. Эти треугольники могут поставить под угрозу результаты экстраполяции таким же образом, что и результаты интерполяции. Смотрите Результаты интерполяции Плохие рядом с выпуклой оболочкой для получения дополнительной информации.
Результаты экстраполяции следует просматривать визуально, используя знания о поведении за пределами области.
Этот пример показывает, как интерполировать две различные выборки одной и той же параболической функции. Это также показывает, что лучшее распределение точек выборки дает лучшие результаты экстраполяции.
Создайте радиальное распределение точек, разнесенных на 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
Создайте второй, более грубо распределенный набор точек. Используйте 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;
Создайте 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)
Оценка F2
и постройте график результатов.
figure vq2 = F2(xq,yq); surf(xq,yq,vq2)
Качество экстраполяции не так хорошо для F2
из-за грубой выборки точек в v2
.
В этом примере показано, как экстраполировать хорошо выбранный 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)
Экстраполяция вернула хорошие результаты, потому что функция хорошо выбрана.