IDL에서의 자료처리에 있어서 내삽(Interpolation) 기법을 사용하여 원하는 값을 구하는 경우들이 꽤 있습니다. 사실 내삽이라고 하는 것이 굉장히 다양한 기법들이 존재합니다. 선형(Linear), 다항식(Polynomial), 스플라인(Spline) 등등 여러 종류들이 있는데요. 오늘은 Spline 내삽 처리에 관하여 알아보고자 합니다.
아마 Spline 내삽이라는 것이 어떤 것인지 아시는 분도 있고 생소하신 분도 있을지 모르겠습니다. 일단 선형 내삽의 경우는 데이터 포인트들에 대하여 인접한 두 포인트를 무조건 직선으로 간주하는 가장 간단한 방법입니다. 반면 인접한 두 포인트를 중심으로 양쪽 하나씩의 포인트를 더 추가하여 총 4개의 포인트들을 3차식으로 좀 더 부드럽게 이어주는 방법이 있는데, 이를 Cubic Spline 내삽이라고 합니다. 물론 일반적으로 얘기한다면 다양한 Spline 내삽 기법들이 존재하겠지만, 가장 무난한 방법은 이와 같은 Cubic Spline 내삽인 것 같습니다. 예제를 갖고 얘길 해보겠습니다. 다음과 같은 2차원 공간상의 데이터가 있다고 가정해봅시다. 그리고 이 데이터를 갖고 다음과 같은 방법으로 2차원 플롯을 그려보면 그 결과는 다음 그림과 같습니다.
datax = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0]
datay = [0.0000, 0.8415, 0.9093, 0.1411, -0.7568, -0.9589, -0.2794]
win = WINDOW(DIMENSIONS=[500, 400])
pl = PLOT(datax, datay, XRANGE=[-2, 8], YRANGE=[-2, 2], SYMBOL='circle', SYM_COLOR='blue', /SYM_FILLED, $
XTITLE='X Data', YTITLE='Y Data', /CURRENT)
이와 같이 인접한 포인트 사이를 무조건 직선으로 이어주는 내삽이 선형(Linear) 내삽이 됩니다. 이 상황에서 X=3.5에 해당되는 Y값을 찾으려면, X값이 3.0 및 4.0인 두 포인트를 이어주는 직선의 방정식에 의하여 내삽을 해주면 됩니다. 하지만 Spline 내삽을 하려면 원론적으로는 복잡한 계산과정이 필요합니다. 각 인접구간마다의 3차 방정식을 구해야 하고, 이걸 전 구간에 대해서 작업하려면 결코 만만한 작업은 아닐겁니다. 다행히도 IDL에는 이와 같은 Spline 내삽을 간단하게 처리할 수 있게 해주는 내장함수가 존재합니다. 함수 이름은 그냥 SPLINE인데요. 다음과 같이 사용하면 됩니다. 여기서는 X가 2.5 및 3.5인 경우에 대한 내삽결과값을 구하도록 해보았습니다. 결과값을 출력해보면 다음과 같습니다.
x = [2.5, 3.5]
y = SPLINE(datax, datay, x)
PRINT, x, y
2.50000 3.50000
0.597421 -0.350840
즉 X=2.5인 경우의 Y 내삽값은 0.39가 되고, X=3.5인 경우는 -0.31로 산출이 됩니다. 이 두 점을 다음과 같은 방법으로 원래의 플롯상에 중첩해보면 다음 그림과 같습니다.
plo = PLOT(x, y, SYMBOL='circle', SYM_COLOR='red', /SYM_FILLED, LINESTYLE=6, /OVERPLOT)
아마도 단순히 선형 내삽을 했을 경우와는 다른 결과임이 눈으로도 보일 것입니다. 그러면 좀 더 많은 X값들에 대한 내삽 결과값들을 구해서 선으로 이어보면 어떨까요? 이번엔 X를 다음과 같이 가정해서 처리해보겠습니다. 즉, 0.0, 0.1, 0.2, ..., 5.9, 6.0와 같은 총 61개의 값들에 대한 내삽 결과를 얻고, 이 결과에 해당되는 포인트들을 선으로 이어준 결과입니다.
win = WINDOW(DIMENSIONS=[500, 400])
pl = PLOT(datax, datay, XRANGE=[-2, 8], YRANGE=[-2, 2], SYMBOL='circle', SYM_COLOR='blue', /SYM_FILLED, $
XTITLE='X Data', YTITLE='Y Data', LINESTYLE=6, /CURRENT)
x = FINDGEN(61)*0.1
y = SPLINE(datax, datay, x)
plo = PLOT(x, y, COLOR='red', /OVERPLOT)
이 그림을 보면 아마도 선형 내삽에 비해서는 훨씬 더 부드러운 곡선으로 내삽이 수행되었음을 알 수 있습니다. 이 내장함수가 사용한 기법은 정확히 얘기하면 Cubic Spline Interpolation이라고 합니다. 사실 이 기법도 세부적으로 들어가면 Natural, Clampled와 같은 두 종류가 존재합니다. 만약 이와 같이 세분화된 기법까지 필요한 경우라면 그냥 SPLINE 함수로 해결하기 보다는, 다음과 같이 SPL_INIT, SPL_INTERP 두 함수를 연달아 사용하는 방식으로 작업이 이루어져야 합니다. 바로 위 예제코드에서 SPLINE 함수가 사용된 한 줄만 아래 두 줄로 대체하면 됩니다. 그리고 그 결과를 그려보면 다음 그림과 같습니다.
ytmp = SPL_INIT(datax, datay, YP0=1, YPN_1=-1); clamped spline
y = SPL_INTERP(datax, datay, ytmp, x)
이것은 구간의 맨 앞 및 맨 끝 부분의 기울기를 각각 YP0 및 YPN_1 키워드를 사용하여 1 및 -1로 설정한 경우입니다. 물론 다른 값으로도 얼마든지 설정 가능하며, 그 값에 따라 전반적인 곡선의 모양 특히 구간의 맨 앞 및 맨 끝에서의 형태가 결국 이 값에 좌우됩니다. 이러한 방식은 Clamped Spline Interpolation에 해당됩니다. 만약 YP0, YPN_1 키워드를 전혀 사용하지 않는다면 다음과 같은 그림으로 얻어지는데 이 경우를 Natural Spline Interpolation이라고 부릅니다.
물론 이와 같은 내삽 기법이 적절한가에 대한 판단은 자료의 성격에 따른 문제일 것입니다. 여기서 소개된 Spline 내삽은 그저 하나의 기법에 지나지 않기 때문입니다. 선형 또는 다항식에 의한 내삽이 더 바람직할 수도 있을겁니다. 어쨌든 위에서 소개된 내장함수들을 사용하여 Spline 내삽을 비교적 쉽게 수행할 수 있다는 사실을 잘 참조해두면, 자료분석에 있어서 상당히 유용하게 사용될 수 있을 것으로 기대해봅니다.
'IDL > Math' 카테고리의 다른 글
IDL에서 적분을 해봅시다 (Part 2) (0) | 2013.11.04 |
---|---|
KRIG2D 함수의 속도 개선 [Updated] (0) | 2013.10.11 |
행렬곱 #와 ##의 차이를 아십니까? (0) | 2013.09.26 |
IDL에서 적분을 해봅시다 (Part 1) (0) | 2013.09.23 |
IDL로 연립방정식을 풀어봅시다 (0) | 2013.09.17 |