Данные, имеющий разброс состоят из набора точек 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® обеспечивает два способа выполнить основанную на триангуляции интерполяцию данных, имеющий разброс:
Класс scatteredInterpolant
Функция griddata
поддерживает 2D интерполяцию данных, имеющий разброс. Функция griddatan
поддерживает интерполяцию данных, имеющий разброс в N-D; однако, это не практично в размерностях выше, чем 6-D для умеренного к большим наборам точки, из-за экспоненциального роста в памяти, требуемой базовой триангуляцией.
Класс scatteredInterpolant
поддерживает интерполяцию данных, имеющий разброс на 2D и 3-D пробеле. Использование этого класса поощряется, когда это более эффективно и с готовностью адаптируется к более широкой области значений проблем интерполяции.
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
.
Функция griddata
полезна, когда необходимо интерполировать, чтобы найти значения в наборе предопределенных местоположений узла решетки. На практике проблемы интерполяции являются часто более общими, и класс scatteredInterpolant
обеспечивает большую гибкость. Класс имеет следующие преимущества:
Это производит функцию интерполяции, которая может быть запрошена эффективно. Таким образом, базовая триангуляция создается однажды и снова используется для последующих запросов.
Метод интерполяции может быть изменен независимо от триангуляции.
Значения в точках данных могут быть изменены независимо от триангуляции.
Точки данных могут быть инкрементно добавлены к существующему interpolant, не инициировав полный перерасчет. Точки данных могут также быть удалены и перемещены эффективно, обеспечены, отредактированное число точек маленькое относительно общего количества точек выборки.
Это обеспечивает функциональность экстраполяции для приближения значений в точках, которые выходят за пределы выпуклой оболочки. Смотрите Данные, имеющий разброс Экстраполирования для получения дополнительной информации.
scatteredInterpolant
обеспечивает следующие методы интерполяции:
самый близкий
Интерполяция ближайшего соседа, где поверхность интерполяции прерывиста.
'linear'
— Линейная интерполяция (значение по умолчанию), где поверхность интерполяции C0 непрерывный.
'natural'
— Естественно-соседняя интерполяция, где поверхность интерполяции C1 непрерывный кроме в точках выборки.
Класс scatteredInterpolant
поддерживает интерполяцию данных, имеющий разброс на 2D и 3-D пробеле. Можно создать interpolant путем вызова 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 = 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 был оценен хорошо в выпуклой оболочке местоположений точки.
При контакте с реальными проблемами интерполяции данные могут быть более сложными. Это может прибыть из измерительного оборудования, которое, вероятно, произведет неточные чтения или выбросы. Базовые данные не могут отличаться гладко, значения могут перейти резко от точки до точки. Этот раздел предоставляет вам некоторые инструкции, чтобы идентифицировать и решить проблемы с интерполяцией данных, имеющий разброс.
Необходимо предварительно обработать демонстрационные данные, который содержит значения 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_flags = isnan(X(:,1)) | isnan(X(:,2)) | isnan(V); X(nan_flags,:) = []; V(nan_flags) = []; F = scatteredInterpolant(X,V);
griddata
и griddatan
возвращают значения NaN
когда вы точки запроса вне выпуклой оболочки с помощью методов 'natural'
или 'linear'
. Однако можно ожидать числовые результаты, если вы запросите те же точки с помощью метода 'nearest'
. Это вызвано тем, что самый близкий сосед точки запроса существует и внутри и снаружи выпуклой оболочки.
Если вы хотите вычислить приближенные значения вне выпуклой оболочки, необходимо использовать scatteredInterpolant
. Смотрите Данные, имеющий разброс Экстраполирования для получения дополнительной информации.
Входные данные редко “совершенны”, и вашему приложению придется обработать дублирующиеся местоположения точки данных. Две или больше точки данных в том же местоположении в вашем наборе данных могут иметь различные соответствующие значения. В этом сценарии scatteredInterpolant
объединяет точки и вычисляет среднее число соответствующих значений. Этот пример показывает, как scatteredInterpolant
выполняет интерполяцию на наборе данных с дублирующимися точками.
Создайте некоторые демонстрационные данные, который находится на плоской поверхности:
x = rand(100,1)*6-3; y = rand(100,1)*6-3; V = x + y;
Представьте дублирующееся местоположение точки путем присвоения координат точки 50 к точке 100:
x(50) = x(100); y(50) = y(100);
Создайте interpolant. Заметьте, что F
содержит 99 уникальных точек данных:
F = scatteredInterpolant(x,y,V)
Проверьте значение, сопоставленное с 50-й точкой:
F.Values(50)
Это значение является средним числом исходного 50-го и 100-го значения, когда эти две точки данных имеют то же расположение:
(V(50)+V(100))/2
В некоторых проблемах интерполяции несколько наборов демонстрационных значений могут соответствовать тем же местоположениям. Например, множество значений может быть зарегистрировано в тех же местоположениях в различные периоды вовремя. Для эффективности можно интерполировать один набор чтений и затем заменить значения, чтобы интерполировать следующий набор.
Всегда используйте сопоставимое управление данными когда заменяющий значения в присутствии дублирующихся местоположений точки. Предположим, что у вас есть два множества значений, сопоставленные с 100 местами точки данных, и требуется интерполировать каждый набор в свою очередь, заменяя значения.
Рассмотрите два множества значений:
V1 = x + 4*y; V2 = 3*x + 5*y
Создайте 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
, чтобы интерполировать первый набор данных. Затем можно заменить значения, чтобы интерполировать второй набор данных.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 оптимизирует производительность в этой установке.
Триангуляция Делоне хорошо подходит для проблем интерполяции данных, имеющий разброс, потому что она имеет благоприятные геометрические свойства, которые приводят к хорошим результатам. Эти свойства:
Отклонение triangles/tetrahedra, имеющего форму щепки в пользу большего количества единиц равносторонней формы.
Пустое свойство описанного круга, которое неявно задает отношение ближайшего соседа между точками.
Пустое свойство описанного круга гарантирует, что интерполированные значения под влиянием точек выборки в окружении местоположения запроса. Несмотря на эти качества, в некоторых ситуациях распределение точек данных может привести к плохим результатам, и это обычно происходит около выпуклой оболочки демонстрационного набора данных. Когда интерполяция приводит к неожиданным результатам, график демонстрационных данных и базовой триангуляции может часто обеспечивать понимание проблемы.
Этот пример показывает интерполированную поверхность, которая ухудшается около контура.
Создайте демонстрационный набор данных, который покажет проблемы около контура.
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 = 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'
соответствует ожидаемой фактической поверхности.