Griddata имеет нежелательную интерполяцию в Matlab

Я пытаюсь интерполировать данные из одной сетки в другую в MATLAB. Первая сетка расположена неравномерно yпока второго нет. Когда я выполняю интерполяцию (используя griddata), результат экстраполируется по областям, где данных не существует.

Вот код и графики до и после интерполяции.

Входные переменные:

Xin2 = [619000      619000      619000      619000      619000      619000
  621000      621000      621000      621000      621000      621000
  623000      623000      623000      623000      623000      623000
  625000      625000      625000      625000      625000      625000
  627000      627000      627000      627000      627000      627000
  629000      629000      629000      629000      629000      629000
  631000      631000      631000      631000      631000      631000
  633000      633000      633000      633000      633000      633000
  635000      635000      635000      635000      635000      635000
  637000      637000      637000      637000      637000      637000
  639000      639000      639000      639000      639000      639000
  641000      641000      641000      641000      641000      641000
  643000      643000      643000      643000      643000      643000
  645000      645000      645000      645000      645000      645000
  647000      647000      647000      647000      647000      647000
  649000      649000      649000      649000      649000      649000
  651000      651000      651000      651000      651000      651000
  653000      653000      653000      653000      653000      653000
  655000      655000      655000      655000      655000      655000
  657000      657000      657000      657000      657000      657000
  659000      659000      659000      659000      659000      659000];

Yin2 = [-688.38      -626.71      -568.39       -514.5      -465.64      -422.03
  -688.36      -626.64      -568.28      -514.35      -465.46      -421.82
  -688.32      -626.51      -568.07      -514.06       -465.1       -421.4
  -688.25      -626.31      -567.74      -513.61      -464.54      -420.75
   -688.2      -626.18      -567.53      -513.33      -464.19      -420.34
  -688.19      -626.13      -567.45      -513.23      -464.06      -420.19
  -688.14      -625.99      -567.22      -512.91      -463.67      -419.73
  -688.06      -625.74      -566.82      -512.37      -463.01      -418.95
  -688.01       -625.6      -566.59      -512.06      -462.61      -418.49
     -688      -625.57      -566.54      -511.99      -462.53       -418.4
  -687.13      -623.02       -562.4      -506.38      -455.59      -410.27
  -677.94       -595.9      -518.32      -446.64      -381.64      -323.64
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3
  -677.06      -593.29      -514.08      -440.89      -374.52       -315.3];

Tempin2 = [0.74399        0.734      0.71456      0.68519      0.64358      0.58546
   0.7444      0.73442      0.71505      0.68578      0.64421      0.58598
   0.7446      0.73456      0.71517      0.68589      0.64428      0.58594
  0.74389       0.7338      0.71437      0.68505      0.64341      0.58507
  0.74176      0.73172      0.71234      0.68311      0.64166      0.58365
  0.73842      0.72847      0.70929      0.68033      0.63925      0.58175
  0.73554      0.72561      0.70641      0.67755      0.63666      0.57929
  0.73602      0.72568      0.70602      0.67671      0.63529      0.57718
  0.74297      0.73128       0.7101      0.67944      0.63682      0.57729
  0.75596      0.74156      0.71799      0.68532       0.6408      0.57963
  0.77081      0.75286      0.72441      0.68681      0.63783      0.57257
  0.77558      0.74655       0.7048      0.65198      0.58381      0.49389
  0.76412      0.73625      0.69626       0.6459      0.57968      0.49109
   0.7519      0.72508      0.68915      0.64346      0.58165      0.49733
  0.74398      0.72001      0.68661      0.64361      0.58471      0.50343
   0.7387        0.718      0.68708      0.64565      0.58851      0.50948
  0.73546      0.71749      0.68821      0.64767      0.59183      0.51471
  0.73255      0.71626      0.68831      0.64861      0.59397      0.51842
  0.72843      0.71274      0.68603      0.64778       0.5947      0.52053
  0.72166       0.7065      0.68148      0.64538      0.59429      0.52148
  0.71285      0.69917      0.67631      0.64259      0.59351      0.52205];

%And the code to make the interpolation variables and run the interpolation:

[X_i,Y_i]=meshgrid([Xin2(:,1)],[-700:5:-315]);
Temp_i=griddata(Xin2,Yin2,Tempin2,X_i,Y_i);

figure,pcolor(Xin2,Yin2,Tempin2), shading flat % original data
figure,pcolor(X_i,Y_i,Temp_i),shading flat %interpolated data

До:

Перед интерполяцией

После: После интерполяции

Может ли кто-нибудь объяснить синий треугольник экстраполированных данных (который соединяется по диагонали приблизительно от (6.4e5,-325) до (6.2e5,-425), и как я могу это остановить?

NB. Я забыл сохранить одинаковые caxis для обоих участков; Это не имеет значения для иллюстрации, где происходит нежелательная интерполяция.

1 ответ

Решение

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

Это то же самое, что и использование none метод экстраполяции для scatteredInterpolant,

Нет экстраполяции. Любые запросы вне выпуклой оболочки F.Points возвращают NaN.

Здесь я показал выпуклый корпус черного цвета (convhull) ваших входов (Xin2 а также Yin2) наложенный на ваш результат интерполяции.

K = convhull(Xin2, Yin2);
plot(Xin2(K), Yin2(K))

введите описание изображения здесь

Что касается того, как предотвратить это, вы можете запрашивать только в тех точках, которые, как вы знаете, находятся в пределах вашего исходного набора данных. Что касается того, как это сделать, вы захотите создать некоторые наброски ваших исходных данных и использовать inpolygon проверить каждую точку запроса, а затем только передать точки запроса (X_i а также Y_i), которые находятся внутри этого плана griddata,

Чтобы получить эту схему, вы можете использовать что-то вроде ordered_outline от gptoolbox,

Другие вопросы по тегам