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

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

Данные , имеющие разбросы состоят из набора точек 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 для умеренных и больших наборов точек из-за экспоненциального роста памяти, требуемого базовой триангуляцией.

The scatteredInterpolant класс поддерживает данный , имеющий разброс в 2-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 вызывается функция. Это может повлиять на эффективность, если один и тот же набор данных интерполируется неоднократно с различными точками запроса. The scatteredInterpolant класс, описанный в Интерполяции данных, имеющих разброс, Использование класса scatteredInterpolant более эффективно в этом отношении.

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

класс scatteredInterpolant

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

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

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

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

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

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

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

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

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

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

The scatteredInterpolant класс поддерживает данный , имеющий разброс в 2-D и трехмерном пространстве. Вы можете создать интерполяцию, позвонив scatteredInterpolant и передачи местоположений точек и соответствующих значений, и, опционально, методов интерполяции и экстраполяции. Смотрите 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'

The Points свойство представляет координаты точек данных и Values свойство представляет связанные значения. The Method свойство представляет метод интерполяции, который выполняет интерполяцию. The 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 значения, поскольку эти данные не могут способствовать интерполяции. Если a NaN удаляется, соответствующие значения данных также должны быть удалены для обеспечения согласованности. Если NaN значения присутствуют в выборочных данных, конструктор при вызове будет ошибаться.

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

Создайте некоторые данные и замените некоторые записи на 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

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 ® 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. The axes with title Interpolated surface from griddata with v4 method contains an object of type surface.

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