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

Данные, имеющий разброс

Данные, имеющий разброс состоят из набора точек X и соответствующие значения V, где точки не имеют никакой структуры или порядка между их относительными местоположениями. Существуют различные подходы к интерполяции данных, имеющий разброс. Один широко используемый подход использует Триангуляцию Делоне точек.

В этом примере показано, как создать поверхность интерполяции путем триангулирования точек и подъема вершин величиной V в размерность, ортогональную к X.

Существуют изменения о том, как можно применить этот подход. В этом примере интерполяция разломана на отдельные шаги; обычно, полный процесс интерполяции выполняется с одним вызовом функции.

Создайте набор данных, имеющий разброс на поверхности параболоида.

X = [-1.5 3.2; 1.8 3.3; -3.7 1.5; -1.5 1.3; ...
      0.8 1.2; 3.3 1.5; -4.0 -1.0; -2.3 -0.7; 
      0 -0.5; 2.0 -1.5; 3.7 -0.8; -3.5 -2.9; ...
      -0.9 -3.9; 2.0 -3.5; 3.5 -2.25];
V = X(:,1).^2 + X(:,2).^2;
hold on
plot3(X(:,1),X(:,2),zeros(15,1), '*r')
axis([-4, 4, -4, 4, 0, 25]);
grid
stem3(X(:,1),X(:,2),V,'^','fill')
hold off
view(322.5, 30);

Figure contains an axes object. The axes object contains 2 objects of type line, stem.

Создайте Триангуляцию Делоне, снимите вершины и оцените interpolant в точке запроса Xq.

figure('Color', 'white')
t = delaunay(X(:,1),X(:,2));

hold on

trimesh(t,X(:,1),X(:,2), zeros(15,1), ...
    'EdgeColor','r', 'FaceColor','none')
defaultFaceColor  = [0.6875 0.8750 0.8984];
trisurf(t,X(:,1),X(:,2), V, 'FaceColor', ...
    defaultFaceColor, 'FaceAlpha',0.9);
plot3(X(:,1),X(:,2),zeros(15,1), '*r')
axis([-4, 4, -4, 4, 0, 25]);
grid
plot3(-2.6,-2.6,0,'*b','LineWidth', 1.6)
plot3([-2.6 -2.6]',[-2.6 -2.6]',[0 13.52]','-b','LineWidth',1.6)
hold off

view(322.5, 30);

text(-2.0, -2.6, 'Xq', 'FontWeight', 'bold', ...
'HorizontalAlignment','center', 'BackgroundColor', 'none');

Figure contains an axes object. The axes object contains 6 objects of type patch, line, text.

Этот шаг обычно включает пересечение структуры данных триангуляции, чтобы найти треугольник, который заключает точку запроса. Если вы находите точку, последующие шаги, чтобы вычислить значение зависят от метода интерполяции. Вы могли вычислить самую близкую точку в окружении и использовать значение в той точке (метод интерполяции ближайшего соседа). Вы могли также вычислить взвешенную сумму значений трех вершин треугольника включения (метод линейной интерполяции). Эти методы и их варианты охвачены в текстах и ссылках на интерполяции данных, имеющий разброс.

Хотя рисунок подсвечивает 2D интерполяцию, можно применить этот метод к более высоким размерностям. В более общих чертах, учитывая набор точек X и соответствующие значения V, можно создать interpolant формы V = F(X). Можно оценить interpolant в точке запроса Xq, дать Vq = F(Xq). Это - однозначная функция; для любой точки запроса Xq в выпуклой оболочке X, это произведет уникальное значение Vq. Выборочные данные приняты, чтобы уважать это свойство для того, чтобы произвести удовлетворительную интерполяцию.

MATLAB® обеспечивает два способа выполнить основанную на триангуляции интерполяцию данных, имеющий разброс:

griddata функционируйте поддерживает 2D интерполяцию данных, имеющий разброс. griddatan функционируйте поддерживает интерполяцию данных, имеющий разброс в N-D; однако, это не практично в размерностях выше, чем 6-D для обработки больших наборов данных, из-за экспоненциального роста в памяти, требуемой базовой триангуляцией.

scatteredInterpolant класс поддерживает интерполяцию данных, имеющий разброс в 2D и трехмерном пространстве. Использование этого класса поощряется, когда это более эффективно и с готовностью адаптируется к более широкой области значений проблем интерполяции.

Интерполяция данных, имеющих разброс, с помощью griddata и griddatan

griddata и griddatan функции берут набор точек выборки, X, соответствующие значения, V, и точки запроса, Xq, и возвратите интерполированные значения, Vq. Синтаксис вызова подобен для каждой функции; первичное различие является 2D / 3-D griddata функция позволяет вам задать точки в терминах XY XYZ координаты. Эти две функции интерполируют данные, имеющий разброс в предопределенных местоположениях узла решетки; намерение состоит в том, чтобы произвести данные с координатной сеткой, отсюда имя. Интерполяция является более общей на практике. Вы можете хотеть запросить в произвольных местоположениях в выпуклой оболочке точек.

В этом примере показано, как griddata функция интерполирует данные, имеющий разброс в наборе узлов решетки и использует эти данные с координатной сеткой, чтобы создать контурный график.

Постройте seamount набор данных (подводная гора является подводной горой). Набор данных состоит из набора долготы (x) и широта (y) местоположения и соответствующий seamount вертикальные изменения (z) измеренный в тех координатах.

load seamount
plot3(x,y,z,'.','markersize',12)
xlabel('Longitude')
ylabel('Latitude')
zlabel('Depth in Feet')
grid on

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

Используйте meshgrid создать набор 2D узлов решетки в плоскости широты долготы и затем использовать griddata интерполировать соответствующую глубину в тех точках.

figure
[xi,yi] = meshgrid(210.8:0.01:211.8, -48.5:0.01:-47.9);
zi = griddata(x,y,z,xi,yi);
surf(xi,yi,zi);
xlabel('Longitude')
ylabel('Latitude')
zlabel('Depth in Feet')

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

Теперь, когда данные находятся в формате с координатной сеткой, вычислите и постройте контуры.

figure
[c,h] = contour(xi,yi,zi);
clabel(c,h);
xlabel('Longitude')
ylabel('Latitude')

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

Можно также использовать griddata интерполировать в произвольных местоположениях в выпуклой оболочке набора данных. Например, глубиной в координатах (211.3,-48.2) дают:

zi = griddata(x,y,z, 211.3, -48.2);

Базовая триангуляция вычисляется каждый раз griddata функция вызвана. Это может повлиять на эффективность, если тот же набор данных неоднократно интерполируется с различными точками запроса. scatteredInterpolant класс, описанный в Интерполяции данных, имеющих разброс, с помощью scatteredInterpolant Класс, более эффективен в этом отношении.

Программное обеспечение MATLAB также обеспечивает griddatan поддерживать интерполяцию в более высоких размерностях. Синтаксис вызова похож на griddata.

класс scatteredInterpolant

griddata функция полезна, когда необходимо интерполировать, чтобы найти значения в наборе предопределенных местоположений узла решетки. На практике проблемы интерполяции являются часто более общими, и scatteredInterpolant класс обеспечивает большую гибкость. Класс имеет следующие преимущества:

  • Это производит функцию интерполяции, которая может быть запрошена эффективно. Таким образом, базовая триангуляция создается однажды и снова используется для последующих запросов.

  • Метод интерполяции может быть изменен независимо от триангуляции.

  • Значения в точках данных могут быть изменены независимо от триангуляции.

  • Точки данных могут быть инкрементно добавлены к существующему interpolant, не инициировав полный перерасчет. Точки данных могут также быть удалены и перемещены эффективно, обеспечены, отредактированное число точек мало относительно общего количества точек выборки.

  • Это обеспечивает функциональность экстраполяции для аппроксимации значений в точках, которые выходят за пределы выпуклой оболочки. Смотрите Данные, имеющий разброс Экстраполирования для получения дополнительной информации.

scatteredInterpolant обеспечивает следующие методы интерполяции:

  • 'nearest' — Интерполяция ближайшего соседа, где поверхность интерполяции прерывиста.

  • 'linear' — Линейная интерполяция (значение по умолчанию), где поверхность интерполяции C0 непрерывный.

  • 'natural' — Естественно-соседняя интерполяция, где поверхность интерполяции C1 непрерывный кроме в точках выборки.

scatteredInterpolant класс поддерживает интерполяцию данных, имеющий разброс в 2D и трехмерном пространстве. Можно создать interpolant путем вызова scatteredInterpolant и передача местоположений точки и соответствующих значений, и опционально методов интерполяции и экстраполяции. Смотрите scatteredInterpolant страница с описанием для получения дополнительной информации о синтаксисах можно использовать, чтобы создать и оценить scatteredInterpolant.

Интерполяция данных, имеющих разброс, с помощью scatteredInterpolant Класс

В этом примере показано, как использовать scatteredInterpolant интерполировать рассеянную выборку peaks функция.

Создайте набор данных, имеющий разброс.

rng default;
X = -3 + 6.*rand([250 2]);
V = peaks(X(:,1),X(:,2));

Создайте interpolant.

F = scatteredInterpolant(X,V)
F = 
  scatteredInterpolant with properties:

                 Points: [250x2 double]
                 Values: [250x1 double]
                 Method: 'linear'
    ExtrapolationMethod: 'linear'

Points свойство представляет координаты точек данных и Values свойство представляет присваиваемые значения. Method свойство представляет метод интерполяции, который выполняет интерполяцию. ExtrapolationMethod свойство представляет метод экстраполяции, используемый, когда точки запроса выходят за пределы выпуклой оболочки.

Можно получить доступ к свойствам F таким же образом вы получаете доступ к полям struct. Например, используйте F.Points исследовать координаты точек данных.

Оцените interpolant.

scatteredInterpolant обеспечивает преобразованную в нижний индекс оценку interpolant. Это оценено тот же путь как функция. Можно оценить interpolant можно следующим образом. В этом случае значение в местоположении запроса дано Vq. Можно оценить в точке единого запроса:

Vq = F([1.5 1.25])
Vq = 1.4838

Можно также передать отдельные координаты:

Vq = F(1.5, 1.25)
Vq = 1.4838

Можно оценить в векторе из местоположений точки:

Xq = [0.5 0.25; 0.75 0.35; 1.25 0.85];
Vq = F(Xq)
Vq = 3×1

    0.4057
    1.2199
    2.1639

Можно оценить F в местоположениях узла решетки и графике результат.

[Xq,Yq] = meshgrid(-2.5:0.125:2.5);
Vq = F(Xq,Yq);
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');
title('Linear Interpolation Method','fontweight','b');

Figure contains an axes object. The axes object with title Linear Interpolation Method contains an object of type surface.

Измените метод интерполяции.

Можно изменить метод интерполяции на лету. Установите метод на 'nearest'.

F.Method = 'nearest';

Переоцените и постройте interpolant как прежде.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'),ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Nearest neighbor Interpolation Method','fontweight','b');

Figure contains an axes object. The axes object with title Nearest neighbor Interpolation Method contains an object of type surface.

Измените метод интерполяции для естественного соседа, переоцените и постройте результаты.

F.Method = 'natural';
Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'),ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Natural neighbor Interpolation Method','fontweight','b');

Figure contains an axes object. The axes object with title Natural neighbor Interpolation Method contains an object of type surface.

Замените значения в местоположениях выборочных данных.

Можно изменить значения V в местоположениях выборочных данных, X, на лету. Это полезно на практике, когда некоторые проблемы интерполяции могут иметь несколько множеств значений в тех же местоположениях. Например, предположите, что вы хотите интерполировать 3-D скоростное поле, которое задано местоположениями (xYZ) и соответствующие разбитые на компоненты векторы скорости (Vx, Vy, Vz). Можно интерполировать каждый из скоростных компонентов путем присвоения их свойству значений (V) в свою очередь. Это имеет важные выигрыши в производительности, потому что это позволяет вам снова использовать тот же interpolant, не подвергаясь издержкам вычисления нового каждый раз.

Следующие шаги показывают, как изменить значения в нашем примере. Вы вычислите значения с помощью выражения, v=xe-x2-y2.

V = X(:,1).*exp(-X(:,1).^2-X(:,2).^2);
F.Values = V;

Оцените interpolant и постройте результат.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Natural neighbor interpolation of v = x.*exp(-x.^2-y.^2)')

Figure contains an axes object. The axes object with title N a t u r a l blank n e i g h b o r blank i n t e r p o l a t i o n blank o f blank v blank = blank x . * e x p ( - x . Squared baseline - y . Squared baseline ) contains an object of type surface.

Добавьте дополнительные местоположения точки и значения к существующему interpolant.

Это выполняет эффективное обновление в противоположность полному перерасчету с помощью увеличенного набора данных.

При добавлении выборочных данных важно добавить и местоположения точки и соответствующие значения.

При продолжении примера создайте новые точки выборки можно следующим образом:

X = -1.5 + 3.*rand(100,2);
V = X(:,1).*exp(-X(:,1).^2-X(:,2).^2);

Добавьте новые точки и соответствующие значения к триангуляции.

F.Points(end+(1:100),:) = X;
F.Values(end+(1:100)) = V;

Оцените усовершенствованный interpolant и постройте результат.

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');

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

Удалите данные из interpolant.

Можно инкрементно удалить точки выборочных данных из interpolant. Также можно удалить точки данных и соответствующие значения от interpolant. Это полезно для удаления побочных выбросов.

При удалении выборочных данных важно удалить и местоположение точки и соответствующее значение.

Удалите 25-ю точку.

F.Points(25,:) = [];
F.Values(25) = [];

Удалите точки 5 - 15.

F.Points(5:15,:) = [];
F.Values(5:15) = [];

Сохраните 150 точек и удалите остальных.

F.Points(150:end,:) = [];
F.Values(150:end) = [];

Это создает более грубую поверхность, когда вы оцениваете и строите:

Vq = F(Xq,Yq);
figure
surf(Xq,Yq,Vq);
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b');
zlabel('Value - V','fontweight','b');
title('Interpolation of v = x.*exp(-x.^2-y.^2) with sample points removed')

Figure contains an axes object. The axes object with title I n t e r p o l a t i o n blank o f blank v blank = blank x . * e x p ( - x . Squared baseline - y . Squared baseline ) blank w i t h blank s a m p l e blank p o i n t s blank r e m o v e d contains an object of type surface.

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

В этом примере показано, как интерполировать данные, имеющий разброс, когда значение в каждом демонстрационном местоположении является комплексным.

Создайте выборочные данные.

rng('default')
X = -3 + 6*rand([250 2]);
V = complex(X(:,1).*X(:,2), X(:,1).^2 + X(:,2).^2);

Создайте interpolant.

F = scatteredInterpolant(X,V);

Создайте сетку точек запроса и оцените interpolant в узлах решетки.

[Xq,Yq] = meshgrid(-2.5:0.125:2.5);
Vq = F(Xq,Yq);

Постройте действительный компонент Vq.

VqReal = real(Vq);
figure
surf(Xq,Yq,VqReal);
xlabel('X');
ylabel('Y');
zlabel('Real Value - V');
title('Real Component of Interpolated Value');

Figure contains an axes object. The axes object with title Real Component of Interpolated Value contains an object of type surface.

Постройте мнимый компонент Vq.

VqImag = imag(Vq);
figure
surf(Xq,Yq,VqImag);
xlabel('X');
ylabel('Y');
zlabel('Imaginary Value - V');
title('Imaginary Component of Interpolated Value');

Figure contains an axes object. The axes object with title Imaginary Component of Interpolated Value contains an object of type surface.

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

Многие иллюстративные примеры в предыдущих разделах имели дело с интерполяцией наборов точки, которые были произведены на сглаженных поверхностях. Кроме того, точки относительно были расположены равными интервалами. Например, кластеры точек не были разделены относительно большими расстояниями. Кроме того, interpolant был оценен хорошо в выпуклой оболочке местоположений точки.

При контакте с реальными проблемами интерполяции данные могут быть более сложными. Это может прибыть из измерительного оборудования, которое, вероятно, произведет неточные показания или выбросы. Базовые данные не могут варьироваться гладко, значения могут перейти резко от точки до точки. Этот раздел предоставляет вам некоторые инструкции, чтобы идентифицировать и решить проблемы с интерполяцией данных, имеющий разброс.

Входные данные, содержащие NaNs

Необходимо предварительно обработать выборочные данные, которые содержат NaN значения, чтобы удалить NaN значения как эти данные не могут способствовать интерполяции. Если NaN удален, соответствующие значения/координаты данных должны также быть удалены, чтобы гарантировать непротиворечивость. Если NaN значения присутствуют в выборочных данных, конструктор будет ошибка, когда названо.

Следующий пример иллюстрирует, как удалить NaNs.

Создайте некоторые данные и замените некоторые записи на NaN:

x = rand(25,1)*4-2;
y = rand(25,1)*4-2;
V = x.^2 + y.^2;

x(5) = NaN; x(10) = NaN; y(12) = NaN; V(14) = NaN;
Это ошибки в коде:
F = scatteredInterpolant(x,y,V);
Вместо этого найдите индексы точки выборки NaNs и затем создают interpolant:
nan_flags = isnan(x) | isnan(y) | isnan(V);

x(nan_flags) = [];
y(nan_flags) = [];
V(nan_flags) = [];

F = scatteredInterpolant(x,y,V);
Следующий пример подобен, если местоположения точки находятся в матричной форме. Во-первых, создайте данные и замените некоторые записи на NaN значения.
X = rand(25,2)*4-2;
V = X(:,1).^2 + X(:,2).^2;

X(5,1) = NaN; X(10,1) = NaN; X(12,2) = NaN; V(14) = NaN;
Это ошибки в коде:
F = scatteredInterpolant(X,V);
Найдите индексы точки выборки NaN и затем создайте interpolant:
nan_flags = isnan(X(:,1)) | isnan(X(:,2)) | isnan(V);

X(nan_flags,:) = [];
V(nan_flags) = [];

F = scatteredInterpolant(X,V);

Interpolant Выходные значения NaN

griddata и griddatan возвратите NaN значения, когда вы точки запроса вне выпуклой оболочки с помощью 'linear' или 'natural' методы. Однако можно ожидать числовые результаты, если вы запросите те же точки с помощью 'nearest' метод. Это вызвано тем, что самый близкий сосед точки запроса существует и внутри и снаружи выпуклой оболочки.

Если вы хотите вычислить приближенные значения вне выпуклой оболочки, необходимо использовать scatteredInterpolant. Смотрите Данные, имеющий разброс Экстраполирования для получения дополнительной информации.

Обработка копии указывает местоположения

Входные данные редко “совершенны”, и вашему приложению придется обработать дублирующиеся местоположения точки данных. Две или больше точки данных в том же местоположении в вашем наборе данных могут иметь различные соответствующие значения. В этом сценарии, scatteredInterpolant объединяет точки и вычисляет среднее значение соответствующих значений. В этом примере показано, как scatteredInterpolant выполняет интерполяцию на наборе данных с дублирующимися точками.

  1. Создайте некоторые выборочные данные, которые находятся на плоской поверхности:

    x = rand(100,1)*6-3;
    y = rand(100,1)*6-3;
    
    V = x + y;
    

  2. Введите дублирующееся местоположение точки путем присвоения координат точки 50 к точке 100:

    x(50) = x(100);
    y(50) = y(100);

  3. Создайте interpolant. Заметьте, что F содержит 99 уникальных точек данных:

    F = scatteredInterpolant(x,y,V)

  4. Проверяйте значение, сопоставленное с 50-й точкой:

    F.Values(50)

Это значение является средним значением исходного 50-го и 100-го значения, когда эти две точки данных имеют то же расположение:

(V(50)+V(100))/2
В этом сценарии interpolant разрешает неоднозначность разумным способом. Однако в некоторых случаях точки данных могут быть близкими, а не совпадающими, и значения в тех местоположениях могут отличаться.

В некоторых проблемах интерполяции несколько наборов демонстрационных значений могут соответствовать тем же местоположениям. Например, множество значений может быть зарегистрировано в тех же местоположениях в различные периоды вовремя. Для КПД можно интерполировать один набор показаний и затем заменить значения, чтобы интерполировать следующий набор.

Всегда используйте сопоставимое управление данными когда заменяющий значения в присутствии дублирующихся местоположений точки. Предположим, что у вас есть два множества значений, сопоставленные с 100 местами точки данных, и требуется интерполировать каждый набор в свою очередь, заменяя значения.

  1. Рассмотрите два множества значений:

    V1 = x + 4*y;
    V2 = 3*x + 5*y
    

  2. Создайте interpolant. scatteredInterpolant объединяет дублирующиеся местоположения, и interpolant содержит 99 уникальных точек выборки:

    F = scatteredInterpolant(x,y,V1)
    Заменяя значения непосредственно через F.Values = V2 средние значения, присваивающие 100 значений 99 выборкам. Контекст предыдущей операции слияния потерян; количество демонстрационных местоположений не будет совпадать с количеством демонстрационных значений. interpolant потребует, чтобы несоответствие было разрешено, чтобы поддержать запросы.

В этом более комплексном сценарии необходимо удалить копии до создания и редактирования interpolant. Используйте unique функционируйте, чтобы найти индексы уникальных точек. unique может также выходные аргументы, которые идентифицируют индексы дублирующихся точек.

[~, I, ~] = unique([x y],'first','rows');
I = sort(I);
x = x(I);
y = y(I);
V1 = V1(I);
V2 = V2(I);
F = scatteredInterpolant(x,y,V1)
Теперь можно использовать F интерполировать набор First Data. Затем можно заменить значения, чтобы интерполировать второй набор данных.
F.Values = V2;

Достижение Эффективности При Редактировании scatteredInterpolant

scatteredInterpolant позволяет вам редактировать свойства, представляющие демонстрационные значения (F.Values) и метод интерполяции (F.Method). Поскольку эти свойства независимы от базовой триангуляции, редактирования могут быть выполнены эффективно. Однако как работа с большим массивом, необходимо заботиться, чтобы не случайно создать ненужные копии при редактировании данных. Копии сделаны, когда больше чем одна ссылка на переменную массив и тот массив затем редактируется.

Копия не сделана в следующем:

A1 = magic(4)
A1(4,4) = 11
Однако копия сделана в этом сценарии, потому что на массив ссылается другая переменная. Массивы A1 и A2 больше не может совместно использовать те же данные, если редактирование сделано:
A1 = magic(4)
A2 = A1
A1(4,4) = 32
Точно так же, если вы передаете массив функции и редактируете массив в этой функции, глубокая копия может быть сделана в зависимости от того, как данные управляемы. scatteredInterpolant содержит данные, и они ведут себя как массив — на языке MATLAB, они называются объектом значения. Язык MATLAB спроектирован, чтобы дать оптимальную эффективность, когда ваше приложение структурировано в функции, которые находятся в файлах. Прототипирование в командной строке не может дать к тому же уровню эффективности.

Следующий пример демонстрирует это поведение, но нужно отметить, что увеличение производительности в этом примере не делает вывод к другим функциям в MATLAB.

Этот код не производит оптимальную эффективность:

x = rand(1000000,1)*4-2;
y = rand(1000000,1)*4-2;
z = x.*exp(-x.^2-y.^2);
tic; F = scatteredInterpolant(x,y,z); toc
tic; F.Values = 2*z; toc
Можно поместить код в файл функции, чтобы выполнить его более эффективно.

Когда MATLAB выполняет программу, которая состоит из функций, которые находятся в файлах, он имеет полное изображение подписания кода; это позволяет MATLAB оптимизировать для эффективности. При вводе код в командной строке, MATLAB не может ожидать то, что вы собираетесь ввести затем, таким образом, это не может выполнить тот же уровень оптимизации. Разработка приложений посредством создания допускающих повторное использование функций является общей практикой и методическими рекомендациями, и MATLAB оптимизирует эффективность в этой установке.

Результаты интерполяции, плохие около выпуклой оболочки

Триангуляция Делоне хорошо подходит для проблем интерполяции данных, имеющий разброс, потому что она имеет благоприятные геометрические свойства, которые приводят к хорошим результатам. Эти свойства:

  • Отклонение треугольников/тетраэдров, имеющих форму щепки в пользу большего количества единиц равносторонней формы.

  • Пустое свойство описанного круга, которое неявно задает отношение ближайшего соседа между точками.

Пустое свойство описанного круга гарантирует, что интерполированные значения под влиянием точек выборки в окружении местоположения запроса. Несмотря на эти качества, в некоторых ситуациях распределение точек данных может привести к плохим результатам, и это обычно происходит около выпуклой оболочки набора выборочных данных. Когда интерполяция приводит к неожиданным результатам, график выборочных данных и базовой триангуляции может часто обеспечивать понимание проблемы.

Этот пример показывает интерполированную поверхность, которая ухудшается около контура.

Создайте набор выборочных данных, который покажет проблемы около контура.

t = 0.4*pi:0.02:0.6*pi;
x1 = cos(t)';
y1 = sin(t)'-1.02;
x2 = x1;
y2 = y1*(-1);
x3 = linspace(-0.3,0.3,16)';
y3 = zeros(16,1);
x = [x1;x2;x3];
y = [y1;y2;y3];

Теперь снимите эти точки выборки на поверхность z=x2+y2 и интерполируйте поверхность.

z = x.^2 + y.^2;
F = scatteredInterpolant(x,y,z);
[xi,yi] = meshgrid(-0.3:.02:0.3, -0.0688:0.01:0.0688);
zi = F(xi,yi);
mesh(xi,yi,zi)
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b') 
zlabel('Value - V','fontweight','b')
title('Interpolated Surface');

Figure contains an axes object. The axes object with title Interpolated Surface contains an object of type surface.

Фактическая поверхность:

zi = xi.^2 + yi.^2;
figure
mesh(xi,yi,zi)
title('Actual Surface')

Figure contains an axes object. The axes object with title Actual Surface contains an object of type surface.

Чтобы изучить, почему поверхность интерполяции ухудшается около контура, полезно посмотреть на базовую триангуляцию:

dt = delaunayTriangulation(x,y);
figure
plot(x,y,'*r')
axis equal
hold on
triplot(dt)
plot(x1,y1,'-r')
plot(x2,y2,'-r')
title('Triangulation Used to Create the Interpolant')
hold off

Figure contains an axes object. The axes object with title Triangulation Used to Create the Interpolant contains 4 objects of type line.

Треугольники в красных контурах относительно хорошо формируются; они создаются из точек, которые находятся в непосредственной близости, и интерполяция работает хорошо в этой области. Вне красного контура треугольники подобны щепке и соединяют точки, которые являются удаленными друг от друга. Нет достаточной выборки, чтобы точно получить поверхность, таким образом, не удивительно, что результаты в этих областях плохи. В 3-D, визуальном осмотре триангуляции становится немного более хитрым, но рассмотрение распределения точки может часто помогать проиллюстрировать потенциальные проблемы.

MATLAB® 4 griddata метод, 'v4', не основано на триангуляции и не затронут ухудшением поверхности интерполяции около контура.

[xi,yi] = meshgrid(-0.3:.02:0.3, -0.0688:0.01:0.0688);
zi = griddata(x,y,z,xi,yi,'v4');
mesh(xi,yi,zi)
xlabel('X','fontweight','b'), ylabel('Y','fontweight','b')
zlabel('Value - V','fontweight','b')
title('Interpolated surface from griddata with v4 method','fontweight','b');

Figure contains an axes object. The axes object with title Interpolated surface from griddata with v4 method contains an object of type surface.

Интерполированная поверхность от griddata использование 'v4' метод соответствует ожидаемой фактической поверхности.