IDL/Math

DERIV 함수를 활용한 도함수(기울기, 미분) 산출

이상우_IDL 2017. 1. 2. 15:15
728x90

오늘은 어떤 함수 f(x)의 도함수를 계산하는데 사용하면 편리한 DERIV라는 함수를 소개해 보기로 하겠습니다. 이 DERIV라는 함수는 말그대로 어떤 함수의 미분을 산출하는 역할을 하는데, 물론 수학적인 방법보다는 수치적인(Numerical) 기법을 활용합니다. IDL 도움말에서 이 함수에 대한 내용을 찾아보면 Three-point (Quadratic) Lagrangian Interpolation이라는 알고리즘을 활용한다고 설명이 되어 있습니다. 간단하게만 언급한다면, 주어진 데이터 포인트들에 대하여 연속된 세 개의 포인트에 대한 내삽을 수행한 다음 도함수값을 계산하는 방식이라고 보면 되는데, 좀 더 자세한 내용에 대해서는 도움말의 내용을 참조하시길 바랍니다.

 

이 DERIV 함수는 데이터 포인트들의 간격이 일정하거나 그렇지 않거나 다 사용이 가능합니다. 따라서 완벽한 수식의 형태로 존재하는 데이터 포인트들에 대해서는 물론이고, 분포가 다소 불규칙한 실측 데이터 포인트들에 대해서도 적용이 가능하다는 장점이 있습니다. 물론 이것은 수치계산적인 기법을 바탕으로 하기 때문에 가능한 것이라고 볼 수 있겠습니다. 그러면 이 함수의 사용법을 예제를 통하여 살펴보기 위하여 다음과 같이 x, y 배열로 구성되는 데이터 포인트들을 생성해 보았습니다.

 

x = FINDGEN(201)

 

y = 2*SIN(x*(2*!PI/50)) + SIN(x*(2*!PI/100))

 

여기서 x는 0~200 범위의 실수값들이고 y는 SIN 함수를 적절히 활용하여 만들어본 함수값들로 구성됩니다. 일단 이 함수의 형태를 그림으로 표출해보면 다음과 같습니다.

 

tstr1 = 'f(x) = 2*SIN(2*x*!pi/50)+SIN(2*x*!pi/100)'

win1 = WINDOW(DIMENSIONS=[600, 500])

pl1 = PLOT(x, y, XRANGE=[0, 200], YRANGE=[-3, 3], $

  /CURRENT, THICK=2, COLOR='blue', TITLE=tstr1, $

 

  MARGIN=[0.07, 0.08, 0.05, 0.08])

 

 

 

이제 이 함수에 대한 도함수 값들을 DERIV 함수를 사용하여 산출해 보겠습니다. 사용 방법 자체는 매우 간단합니다. 다음과 같이 DERIV 함수에 x, y를 인자로 넣어주기만 하면 됩니다.

 

der = DERIV(x, y)

 

이렇게 얻어진 der이라는 배열은 x 배열상의 각 값에 대한 y의 도함수 값들 201개를 담게됩니다. 따라서 다음과 같이 그림으로 표출해볼 수 있습니다.

 

tstr2 = 'Red Line : Derivative of f(x)'

win2 = WINDOW(DIMENSIONS=[600, 500])

pl2 = PLOT(x, der, XRANGE=[0, 200], YRANGE=[-1, 1], $

  /CURRENT, THICK=2, COLOR='crimson', TITLE='Derivative of f(x)', $

 

  MARGIN=[0.07, 0.08, 0.05, 0.08])

 

 

 

앞서 그려진 두 그림을 비교해보면 원 함수인 y의 값들과 DERIV 함수로 산출된 도함수(기울기) 값들을 동일한 x 값에 대하여 비교해볼 수 있습니다. 아무래도 x값들의 범위가 0~200인 반면 y값들의 범위는 대략 -3~+3 정도이므로 기울기 값 자체는 대략 -0.3~+0.3 정도의 범위를 갖게 됩니다. 어쨌든 원래 함수의 패턴과 비교해보면 기울기의 값들이 제대로 산출되어 있음을 확인할 수 있습니다.

 

이와 같이 DERIV 함수는 사용법이 매우 간단하면서도 도함수(기울기)의 값들을 나름 제대로 산출해주는 역할을 합니다. 또한 앞서 언급했듯이 데이터 포인트들의 간격이 일정하든 그렇지 않든 모두 활용이 가능하다는 장점이 있습니다. 여러분들도 다양한 함수 패턴 또는 데이터 값들에 대하여 이 DERIV 함수를 활용해 보시면 좋을 것 같습니다. 위에서 설명한 예제에 대하여 DERIV 함수의 결과를 좀 더 직관적으로 표출하기 위하여 다음과 같이 특정한 (x, y) 포인트에 대하여 산출된 기울기 값을 이용하여 접선을 그려 보고자 합니다. 이 과정은 사실 약간은 복잡해 보일 수도 있는데, 코드 자체는 다음과 같습니다. 먼저 원본 데이터인 x, y를 사용하여 플롯은 표출합니다.

 

sx = 720

sy = 480

win3 = WINDOW(DIMENSIONS=[sx, sy])

pl3 = PLOT(x, y, XRANGE=[0, 200], YRANGE=[-3, 3], $

  THICK=2, COLOR='blue', /CURRENT)

tx1 = TEXT(0.5, 0.96, tstr1, ALIGNMENT=0.5, COLOR='blue', /NORMAL)

 

tx2 = TEXT(0.5, 0.91, tstr2, ALIGNMENT=0.5, COLOR='crimson', /NORMAL)

 

그리고 여기서는 x의 값이 55인 경우에 대한 기울기 값을 이용하여 접선을 그리기 위하여 다음과 같은 내용을 실행해 보았습니다. 여기서는 특정한 x의 값(여기서는 55)인 xd를 중심으로 앞뒤로 -10 및 +10만큼의 범위에 해당되는 x값들에 대하여 직선의 방정식을 얻고 이를 바탕으로 접선을 덧그리는 방식을 구현해 보았습니다.

 

xd = 55

ww = WHERE(x EQ xd)

ww = ww[0]

slope = der[ww]

xl = [x[ww]-10, x[ww], x[ww]+10]

yl = slope*(xl-x[ww]) + y[ww]

pl3o = PLOT(xl, yl, COLOR='crimson', CLIP=0, THICK=2, /OVERPLOT)

 

 

이와 같은 내용들을 실행해 보면 그 결과는 다음 그림과 같습니다.

 

 

 

물론 위 내용에서 xd의 값을 다양하게 바꿔보면 다양한 x값들에 대한 기울기 값을 바탕으로 한 접선들을 그려볼 수 있습니다. 여러 종류의 x값들에 대해서 확인을 해보면, DERIV 함수로 산출된 도함수 결과가 상당히 정확한 것으로 보입니다. 그래서 이렇게 다양한 x값들에대한 접선들의 모습을 한 눈에 볼 수 있도록 하기 위하여, 0~200의 모든 x값들에 대한 접선들의 모습을 담은 동영상을 만들어 보았습니다. 조금 투박하긴 하지만 가벼운 마음으로 봐주시기 바랍니다.

 

 

LIST