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
,