scatteredInterpolant
обеспечивает функциональность для аппроксимации значений в точках, которые выходят за пределы выпуклой оболочки. '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
Создайте второй, более грубо распределенный набор точек. Используйте gallery
функция, чтобы создать случайные выборки в области значений, [-10, 10].
x2 = -10 + 20*gallery('uniformdata',[25 1],0); y2 = -10 + 20*gallery('uniformdata',[25 1],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');
Оцените interpolant по 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)
Экстраполяция возвратила хорошие результаты, потому что функция хорошо производится.