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

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

Данные, имеющий разброс состоят из набора точек 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);

Создайте Триангуляцию Делоне, снимите вершины и оцените 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');

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

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

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

griddata и функции griddatan берут набор точек выборки, X, соответствующих значений, V, и точек запроса, Xq, и возвращают интерполированные значения, Vq. Синтаксис вызова подобен для каждой функции; первичное различие является 2D / 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

Используйте 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
[c,h] = contour(xi,yi,zi);
clabel(c,h);
xlabel('Longitude')
ylabel('Latitude')

Можно также использовать 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 обеспечивает следующие методы интерполяции:

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

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

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

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

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

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

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

X = -3 + 6.*gallery('uniformdata',[250 2],0);
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.3966

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

Vq = F(1.5, 1.25)
Vq = 1.3966

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

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

    1.0880
    1.8127
    2.3472

Можно оценить 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');

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

Можно изменить метод интерполяции на лету. Установите метод на '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');

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

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');

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

Можно изменить значения V в местоположениях выборочных данных, X, на лету. Это полезно на практике, когда некоторые проблемы интерполяции могут иметь несколько множеств значений в тех же местоположениях. Например, предположите, что вы хотите интерполировать 3-D скоростное поле, которое задано местоположениями (x, y, z) и соответствующие разбитые на компоненты векторы скорости (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)')

Добавьте дополнительные местоположения точки и значения к существующему 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');

Удалите данные из 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')

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

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

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

X = -3 + 6 .* gallery('uniformdata',[250 2],0);
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');

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

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

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

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

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

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

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

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

Создайте некоторые данные и замените некоторые записи на 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);
Вместо этого найдите индексы точки выборки NaN s и затем создайте 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 когда вы точки запроса вне выпуклой оболочки с помощью методов 'natural' или 'linear'. Однако можно ожидать числовые результаты, если вы запросите те же точки с помощью метода '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');

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

zi = xi.^2 + yi.^2;
figure
mesh(xi,yi,zi)
title('Actual 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

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

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