내삽 또는 보간이라고 부르는 Interpolation이라는 기법에 대해서는 아마 많이들 알고 계시리라 생각합니다. 공간 또는 시간적인 분포를 하는 데이터가 주어진 상태에서, 원래 데이터 값이 존재하지 않던 특정한 위치에 대한 값을 계산하여 추정하는 기법이라고 할 수 있습니다. 특히 공간 분포의 관점에서 본다면 원론적으로는 1차원, 2차원, 3차원 등 모든 차원에 대하여 원리 자체는 동일하다고 볼 수 있습니다. 사실 2차원 데이터를 기반으로 한 내삽 기법에 관해서는 제가 예전에 관련 게시물을 작성하여 올린 바 있습니다. 오늘은 가장 기본이 된다고 볼 수 있는 1차원 데이터에 대한 내삽 기법에 관하여 관련 예제와 함께 소개해보기로 하겠습니다.
IDL에서 1차원 내삽 기법에 해당되는 기능 함수는 바로 INTERPOL 함수입니다. 그런데 앞서 언급한 예전 게시물에서도 언급되었듯이 IDL에서는 비슷한 이름을 가진 INTERPOLATE 함수도 있습니다. 혼란을 피하기 위하여 다시 한번 언급하자면, INTERPOLATE 함수는 1차원 뿐 아니라 2차원, 3차원 내삽 기능까지 탑재한 것이고, INTERPOL 함수는 1차원 내삽만을 위한 전용 함수입니다. 따라서 지금부터는 예제용 1차원 데이터에 대하여 INTERPOL 함수를 사용하여 내삽 결과를 얻는 방법을 살펴보기로 하겠습니다. 먼저 예제용 1차원 데이터는 다음과 같이 7개의 값들로 구성된 x 및 y 배열로 정의합니다.
x = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0]
y = [9.16, 72.35, 86.93, 24.41, -55.68, -75.89, -47.94]
그리고 이 데이터의 모습을 가시화하기 위한 표출 과정은 다음과 같습니다.
win = WINDOW(DIMENSIONS=[600, 500], /NO_TOOLBAR)
p = PLOT(x, y, AXIS_STYLE=1, XMINOR=0, YMINOR=0, $
XTITLE='X', YTITLE='Y', LINESTYLE=6, SYMBOL='circle', $
/SYM_FILLED, SYM_SIZE=1.2, SYM_COLOR='blue', $
FONT_SIZE=11, MARGIN=[0.15, 0.1, 0.05, 0.1], /CURRENT)
표출된 원본 데이터의 모습은 다음 그림과 같습니다.
이제 이 상태에서 X 좌표가 4.5일 때 Y의 값이 얼마가 될지를 내삽에 의하여 산출해봅시다. 이 과정에서는 내삽에 있어서 가장 기본적이고 단순한 기법인 선형 내삽(Linear Interpolation) 기법을 적용해보겠습니다. 이를 위하여 INTERPOL 함수를 사용하면 되는데요. 그 과정은 다음과 같습니다.
xf = 4.5
yf = INTERPOL(y, x, xf)
HELP, xf, yf
PRINT, xf
PRINT, yf
여기서는 내삽 값을 얻고자 하는 X 좌표값을 xf라는 변수에 담고 이를 INTERPOL 함수에 투입하였습니다. 그리고 INTERPOL 함수에 투입되는 인수들은 위와 같이 Y 배열, X 배열, X 좌표값의 순서가 되어야 합니다. 내삽의 결과는 yf라는 변수에 담겨지도록 하였습니다. HELP 및 PRINT에 의하여 출력된 결과를 보면 다음과 같습니다.
XF FLOAT = 4.50000
YF FLOAT = -15.6350
4.50000
-15.6350
이와 같이 X 좌표 4.5에 대한 Y 내삽 값은 -15.635로 산출됩니다. 그러면 이 결과를 도식적으로 살펴보기 위하여 앞서 표출했던 그림 상에 이 결과 데이터를 추가해봅시다. 어차피 하나의 데이터 포인트만 추가되는 경우이기 때문에 다음과 같이 SYMBOL 함수를 사용하면 됩니다.
pf = SYMBOL(xf, yf, SYMBOL='circle', /SYM_FILLED, $
SYM_COLOR='crimson', SYM_SIZE=1.2, /DATA)
결과는 다음 그림과 같습니다.
어차피 선형 내삽이라는 기법의 특성상 xf 값의 앞뒤에 있는 실제 데이터 값들을 서로 직선으로 이어준 그 선상에 yf 값이 위치하게 됩니다. 다음과 같은 그림을 참조해보면 쉽게 짐작이 가능합니다.
참고로 이러한 그림을 얻기 위해서는 앞서 PLOT 함수가 사용된 내용에서 LINESTYLE 속성의 값만 1로 바꿔주면 됩니다.
p = PLOT(x, y, AXIS_STYLE=1, XMINOR=0, YMINOR=0, $
XTITLE='X', YTITLE='Y', LINESTYLE=1, SYMBOL='circle', $
/SYM_FILLED, SYM_SIZE=1.2, SYM_COLOR='blue', $
FONT_SIZE=11, MARGIN=[0.15, 0.1, 0.05, 0.1], /CURRENT)
앞선 예제에서는 내삽의 결과를 단 하나의 X 좌표값에 대해서만 얻었는데요. 여러 개의 X 좌표값들에 대한 내삽 결과를 한꺼번에 얻는 것도 가능합니다. 다음과 같이 원하는 X 좌표값들로 구성된 배열의 형태로 xf를 정의하면 됩니다.
xf = [1.7, 3.2, 4.5, 5.6]
여기서는 4종(1.7, 3.2, 4.5, 5.6)의 X 좌표값들에 대한 결과를 한꺼번에 얻기 위하여 xf를 배열의 형태로 새로 정의한 것입니다. 그 외 나머지 내용은 변동이 없으므로 이 상태에서 전체적으로 다시 실행해보면 출력 결과 및 그림은 다음과 같습니다.
XF FLOAT = Array[4]
YF FLOAT = Array[4]
1.70000 3.20000 4.50000 5.60000
53.3930 74.4260 -15.6350 -67.8060
이와 같이 선형 내삽 기법에 의하여 산출된 결과들이 제대로 표출되었음을 확인할 수 있습니다. 그러면 이번에는 아예 더 많은 X 좌표값들을 촘촘하게 정의하여 결과를 얻어봅시다.
xf = [1.0:7.0:0.2]
즉 이와 같이 1.0부터 7.0까지 0.2 간격의 값들 31개로 구성된 배열의 형태로 xf를 정의하여 결과를 얻는 것입니다. 역시 나머지 실행 내용은 동일합니다. 결과 그림을 보면 다음과 같습니다.
이와 같은 방식으로 다수의 X 좌표 값들에 대한 내삽 결과를 얻고 표출할 수도 있습니다. 그리고 이와 같이 결과에 해당되는 값들이 갯수도 많고 촘촘할 경우에는 심볼의 형태 대신 그냥 선으로 표현하는 것이 더 나을 수도 있습니다. 즉 SYMBOL 함수를 사용하는 대신 다음과 같이 PLOT 함수를 사용하는 것입니다.
pf = PLOT(xf, yf, COLOR='crimson', THICK=2, /OVERPLOT)
이렇게 처리하면 그 결과는 다음 그림과 같습니다.
이러한 결과 그림을 보면 선형 내삽(Linear Interpolation) 기법의 특성을 쉽게 파악할 수 있습니다. INTERPOL 함수에서는 선형 내삽 기법 외에도 다른 기법들도 적용이 가능합니다. 먼저 다음과 같이 INTERPOL 함수를 /QUADRATIC 키워드와 함께 사용하면, 각 구간별로 인접한 3개의 포인트들을 2차 곡선으로 이어주는 2차 내삽(Quadratic Interpolation) 기법이 적용됩니다.
yf = INTERPOL(y, x, xf, /QUADRATIC)
이렇게 처리하면 그 결과는 다음 그림과 같습니다.
그리고 다음과 같이 INTERPOL 함수를 /SPLINE 키워드와 함께 사용하면, 각 구간별로 인접한 4개의 포인트들을 3차 곡선으로 이어주면서도 구간과 구간 사이를 부드럽게 이어주는 3차 스플라인 내삽(Cubic Spline Interpolation) 기법이 적용됩니다.
yf = INTERPOL(y, x, xf, /SPLINE)
이렇게 처리하면 그 결과는 다음 그림과 같습니다.
특히 방금과 같이 /SPLINE 키워드를 사용하여 얻은 결과를 앞서 선형 내삽으로 얻은 결과와 비교해보면, 데이터 포인트들을 좀 더 자연스러운 느낌으로 이어주는 것 같은 느낌이 듭니다. 물론 그렇다고 해서 어떤 기법이 더 좋다 나쁘다를 따질 수 있는 것은 절대로 아닙니다. 각 기법마다 특성이 있고, 실제로 취급하게 될 데이터의 특성에 맞는 기법을 적용하는 것이 더 중요합니다. 실제로는 선형 내삽 기법이 더 선호되는 경우도 꽤 많습니다.
그리고 한가지 경우만 더 언급하자면, 데이터 포인트들의 간격이 반드시 일정하지 않아도 됩니다. 즉 앞선 예제들에서는 원본 데이터의 X 값들의 간격이 1.0으로 일정했는데, 다음과 같이 불규칙한 간격의 값들일 경우에도 결과를 얻을 수 있습니다.
x = [1.4, 2.5, 3.8, 4.2, 5.6, 6.5, 6.8]
y = [9.16, 72.35, 86.93, 24.41, -55.68, -75.89, -47.94]
이러한 경우에 대한 결과를 얻는데 있어서 xf를 다음과 같이 0.1 간격이 되도록 정의하여 선형 내삽 기법으로 결과를 얻어보면 그 모습은 다음 그림과 같습니다.
xf = [1.0:7.0:0.1]
yf = INTERPOL(y, x, xf)
따라서 이와 같은 방식으로 1차원 데이터에 대하여 INTERPOL 함수를 적용하여 다양한 내삽 결과들을 얻을 수 있다는 것을 염두에 두시면 여러모로 편리할 것 같습니다.
'IDL > Math' 카테고리의 다른 글
DISTANCE_MEASURE 함수 소개 (0) | 2023.10.12 |
---|---|
Interpolation vs. Fitting (0) | 2021.08.02 |
MEDIAN 함수에 의한 중간값 산출에 관한 유의사항 (0) | 2021.06.18 |
GAUSS2DFIT 함수를 이용한 2차원 Gaussian 함수 근사 (0) | 2021.01.05 |
GAUSSFIT 함수를 이용한 Gaussian 함수 근사 (0) | 2020.12.28 |