exponenta event banner

Интерполяция рассеянных данных

Разбросанные данные

Разбросанные данные состоят из набора точек 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. The axes contains 2 objects of type line, stem.

Создание триангуляции Делоне, подъем вершин и вычисление интерполятора в точке запроса 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. The axes contains 6 objects of type patch, line, text.

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

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

MATLAB ® предоставляет два способа выполнения интерполяции рассеянных данных на основе триангуляции:

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

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

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

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

В этом примере показано, как 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. The axes contains an object of type line.

Использовать meshgrid для создания набора 2-D точек сетки в плоскости долготы-широты и последующего использования 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. The axes contains an object of type surface.

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

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

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

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

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

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

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

разброс Класс интерполяции

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

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

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

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

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

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

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

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

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

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

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

Интерполяция рассеянных данных с использованием класса интерполяции рассеяния

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

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

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

Создайте интерполятор.

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 для проверки координат точек данных.

Вычислите интерполятор.

scatteredInterpolant обеспечивает подстрочную оценку интерполятора. Его оценивают так же, как функцию. Можно вычислить интерполятор следующим образом. В этом случае значение в местоположении запроса задается 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. The axes with title Linear Interpolation Method contains an object of type surface.

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

Метод интерполяции можно изменить на лету. Задайте для метода значение 'nearest'.

F.Method = 'nearest';

Выполните переоценку и постройте график интерполятора, как и раньше.

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. The axes 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. The axes with title Natural neighbor Interpolation Method contains an object of type surface.

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

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

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

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

Вычислите интерполятор и постройте график результата.

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. The axes with title Natural neighbor interpolation of v = x.*exp(-x.^2-y.^2) contains an object of type surface.

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

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

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

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

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;

Вычислите уточненный интерполятор и постройте график результата.

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

Удаление данных из интерполятора.

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

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

Снимите 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. The axes with title Interpolation of v = x.*exp(-x.^2-y.^2) with sample points removed 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);

Создайте интерполятор.

F = scatteredInterpolant(X,V);

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

[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. The axes 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. The axes with title Imaginary Component of Interpolated Value contains an object of type surface.

Решение проблем интерполяции разрозненных данных

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

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

Входные данные, содержащие 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 и затем построить интерполятор:
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, а затем создайте интерполятор:
nan_flags = isnan(X(:,1)) | isnan(X(:,2)) | isnan(V);

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

F = scatteredInterpolant(X,V);

Интерполянт выводит значения 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. Создайте интерполятор. Обратите внимание, что F содержит 99 уникальных точек данных:

    F = scatteredInterpolant(x,y,V)

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

    F.Values(50)

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

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

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

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

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

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

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

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

В этом более сложном сценарии перед созданием и редактированием интерполятора необходимо удалить дубликаты. Используйте 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 для интерполяции первого набора данных. Затем можно заменить значения для интерполяции второго набора данных.
F.Values = V2;

Достижение эффективности при редактировании точечного интерполятора

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. The axes 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. The axes 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. The axes with title Triangulation Used to Create the Interpolant contains 4 objects of type line.

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

MATLAB ® 4griddata способ, '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. The axes with title Interpolated surface from griddata with v4 method contains an object of type surface.

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