IDL/New Graphics

수식(Equation)의 가시화에 관한 유의 사항들

이상우_idl 2024. 7. 12. 16:04
728x90
반응형

앞서 두 차례에 걸쳐서 데이터 배열 없이 수식(Equation)만 받아서 가시화하는 기능들에 관한 게시물들을 올린 바 있습니다. PLOT 함수에서 1차원 수식을 가시화하는 방법에 관한 게시물 그리고 CONTOUR 및 SURFACE 함수에서 2차원 수식을 가시화하는 방법에 관한 게시물 두가지로 나눠서 올렸는데요. 두 게시물에서 미처 언급하지 못했지만 유의해야 할 사항들이 좀 있어서 여기서 마저 정리를 해보고자 합니다.

 

1) IDL NG(New Graphics) 체계의 PLOT, CONTOUR, SURFACE 함수에서만 지원됩니다. 그리고 이러한 기능이 지원되기 시작한 것은 IDL 8.3 버전부터입니다. 그 이전 버전의 IDL에서는 지원되지 않습니다.

 

2) 웬지 3차원 수식을 VOLUME 같은 함수에서 지원할 수도 있지 않을까 하는 생각이 들 수도 있는데, 아직은 3차원 수식에 대한 가시화 기능은 지원되지 않습니다.

 

3) 수식을 표현할 때에는 반드시 알파벳 x, y로 표현해야 합니다. 예를 들어서 '(x^2+y-11)^2+(x+y^2-7)^2'는 괜찮지만, 다른 알파벳을 사용하여 '(a^2+b-11)^2+(a+b^2-7)^2'와 같이 표현하는 것은 허용되지 않습니다.

 

4) 수식만 받아서 가시화하는데 있어서 데이터 포인트들의 갯수를 EQN_SAMPLES 속성을 통하여 조정할 수 있습니다. 디폴트 값은 PLOT 함수의 경우 1000이고 CONTOUR 및 SURFACE 함수의 경우는 200입니다. 이 갯수를 줄이면 선의 윤곽이 투박해질 것이고 늘리면 더 부드러워질 것입니다. 아래 두 그림은 PLOT 함수에 수식만 투입하여 표출된 그림들로서 상단의 그림은 EQN_SAMPLES 속성이 디폴트인 1000인 경우이고 하단의 그림은 이 속성을 20으로 대폭 줄인 경우입니다. 두 그림을 비교해보면 EQN_SAMPLES 속성의 역할을 확인할 수 있습니다.

 

5) 수식만 받아서 가시화하는데 있어서 축의 범위는 X, Y 축 모두 [-10, 10]이 디폴트입니다. 물론 XRANGE, YRANGE 속성을 사용하여 변경하는 것도 가능합니다. 그리고 축의 범위를 변경하더라도 그림이 그 범위에 연동되어 축 범위에 맞춰서 그려지게 됩니다. 이것은 데이터 배열을 사용하는 경우와 비교하면 나름의 장점이라도 볼 수 있습니다. 아래의 두 그림들 중 상단의 그림은 X축의 범위를 디폴트로 둔 경우이고 하단의 그림은 X축의 범위를 [-20, 20]으로 늘린 것인데, 플롯의 라인이 X축의 범위에 연동되어 표출된 것을 확인할 수 있습니다.

 

6) 수식이 너무 긴 경우에는 변수에 담거나 분할 표기하는 방법도 있습니다. 즉 기본적으로는 다음과 같이 함수 내에 직접 적어줘도 되지만,

 

  c = CONTOUR( '(x^2+y-11)^2+(x+y^2-7)^2', ~~~~~~)

 

다음과 같이 변수에 담은 후 이 변수만 함수에 전달하는 방법도 있고

 

equation = '(x^2+y-11)^2+(x+y^2-7)^2'
  c = CONTOUR(equation, ~~~~~)

 

그래도 수식이 너무 길다 싶으면 다음과 같이 처리하는 것도 괜찮습니다.

 

equation = '(x^2+y-11)^2+'+$
    '(x+y^2-7)^2'
  c = CONTOUR(equation, ~~~~~)

 

7) 그래픽 함수에 전달되는 수식은 단일 표현식(single statement) 형태가 되어야 한다는 것을 유의해야 합니다. 그리고 유저가 정의한 커스텀 함수를 명시하는 것도 허용되지만, 함수 내의 수식 역시 단일 표현식이 되어야 한다는 조건은 동일합니다. 예를 들면 유저 정의 함수의 내용이 다음과 같은 경우는 문제가 없습니다.

 

FUNCTION my_func, x
y = 3.2*EXP(-x^2/5.5)
RETURN, y
END

 

하지만 다음과 같이 별도의 구문으로 케이스가 나눠진다든지 하는 방식은 허용되지 않습니다. 그냥 단순한 표현의 수식이어야만 합니다.

 

FUNCTION my_func, x
IF x LT 0 THEN y = -x^2 ELSE y = 3*x
RETURN, y
END

 

반응형