Как использовать TriScatteredInterp в MatLab?

#matlab #interpolation #points

#matlab #интерполяция #Очки

Вопрос:

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

 long = data(:,1)
lat = data(:,2)
values = data(:,3)
lat = lat.*(pi/180)
long = long.*(pi/180)
X = cos(lat).*cos(long)
Y = cos(lat).*sin(long)
Z = sin(lat)
F = TriScatteredInterp(X,Y,Z,values)
[long1 lat1] = meshgrid(-pi:pi/360:pi, -pi/2:pi/360:pi/2);
X1 = cos(lat1).*cos(long1)
Y1 = cos(lat1).*sin(long1)
Z1 = sin(lat1);
F.Method = 'natural'
InterpVals = F(X1,Y1,Z1);
mesh(long1, lat1, InterpVals)
  

Как вы можете видеть для каждой (длинной, широтной) точки, я вычислил соответствующую точку на сфере и использовал 3D-версию TriScatteredInterp.
Проблема в том, что интерполяция работает только для «ближайшего» метода, так как для линейного или естественного генерируется только NaN. Как я читал, это происходит, когда точки, которые я хочу интерполировать, находятся за пределами выпуклой оболочки триангуляции, но поскольку необходимые точки находятся точно на сфере, а входные точки охватывают весь диапазон (длина: от -180 до 180, широта: от -90 до 90), я просто не понимаю, как все точки могут находиться за пределами выпуклой оболочки. Любая помощь будет оценена, Тай.

Ответ №1:

Вы должны интерполировать значения по двумерным исходным данным (long, lat), а не по трехмерным (X, Y, Z). Обратите внимание, что я включил некоторый фиктивный генератор данных для читателей, у которых нет доступа к вашим данным ()!

 n = 100;
long = rand(n,1)*720-360;
lat = rand(n,1)*180-90;
values = rand(n,1)*30-5;
lat = lat.*(pi/180);
long = long.*(pi/180);

F = TriScatteredInterp(long,lat,values);
[long1 lat1] = meshgrid(-pi:pi/36:pi, -pi/2:pi/24:pi/2);
InterpVals = F(long1,lat1);

X1 = cos(lat1).*cos(long1);
Y1 = cos(lat1).*sin(long1);
Z1 = sin(lat1);
mesh(X1,Y1,Z1,InterpVals); %note here the meshing on the regular grid (X1,Y1,Z1)
  

По-прежнему существует проблема с краями карты, поскольку интерполятор не знает, что данные «обтекаются». Содержимое интерполяций на этих ребрах будет .. NaN!

Редактировать: предложения по переносу: 1) перепишите TriScatteredInterp так, чтобы он использовал модули; 2) отразите данные по «краям» карты, интерполируйте, затем обрежьте их до исходного размера; 3) проверьте Matlab Mapping Toolbox, который анализирует и визуализирует географическую информацию.

Комментарии:

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

2. Ваша сетка (состоящая из прямоугольных граней) приближается к сфере. Его вершины лежат на сфере, как и ваши данные. Однако грани находятся «внутри» сферы. По сути, все ваши данные находятся за пределами выпуклой оболочки, определяемой сеткой. Поэтому вы получаете NaN! Это связано с тем, на что я намекал ранее.

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