Part 2: 파이썬으로 고등학교 수학 정복하기
Chapter 8: 함수와 그래프 그리기 (Matplotlib 소개)
학습 목표
- 다양한 고등학교 수학 함수를 파이썬 코드로 표현할 수 있다.
- Matplotlib 라이브러리를 사용하여 함수 그래프를 시각화할 수 있다.
- 그래프에 제목, 축 레이블, 범례, 격자 등을 추가하여 정보를 명확하게 전달할 수 있다.
- 그래프를 통해 함수의 평행이동, 대칭이동, 확대/축소 등 변환을 시각적으로 이해한다.
- 함수의 증가/감소, 주기, 점근선 등 주요 특징을 그래프를 통해 직관적으로 파악한다.
1. 눈으로 보는 수학: 왜 그래프가 중요할까?
수학에서 함수는 두 양 사이의 관계를 나타내는 강력한 도구입니다. y = 2x + 1
이나 y = x² - 3x
와 같은 수식은 그 관계를 간결하게 표현하지만, 수식만으로는 함수의 전체적인 모습이나 특징을 한눈에 파악하기 어려울 때가 많습니다. 예를 들어, y = x³ - 3x
라는 삼차함수가 어디서 증가하고 어디서 감소하는지, 어디서 극값을 가지는지 수식만 보고 바로 알기는 쉽지 않죠.
이때 그래프(Graph)가 등장합니다. 함수를 그래프로 시각화하면 다음과 같은 엄청난 이점들이 있습니다.
- 직관적 이해: 함수의 증가/감소, 위/아래 볼록성, 최댓값/최솟값, 주기성 등을 마치 그림을 보듯 직관적으로 이해할 수 있습니다.
- 패턴 발견: 함수 값이 어떻게 변화하는지 그 경향성이나 패턴을 쉽게 발견할 수 있습니다.
- 관계 명확화: 여러 함수를 함께 그리면 그들의 교점(연립방정식의 해), 대소 관계 등을 명확히 비교할 수 있습니다.
- 변화 예측: 함수의 계수나 형태를 조금씩 바꿀 때 그래프가 어떻게 변하는지 관찰하며 함수의 변환(평행이동, 대칭이동 등) 원리를 생생하게 배울 수 있습니다.
파이썬은 이러한 함수 그래프를 매우 효과적으로, 그리고 아름답게 그릴 수 있는 강력한 도구를 제공합니다. 그 주인공이 바로 Matplotlib 라이브러리입니다. 이번 장에서는 Matplotlib를 이용하여 고등학교에서 배우는 다양한 함수들을 직접 그려보고, 그래프라는 렌즈를 통해 수학 개념을 더욱 깊고 재미있게 탐구해 보겠습니다.
2. 그래프 전문가, Matplotlib 만나보기
Matplotlib는 파이썬에서 데이터를 시각화하는 데 가장 기본적이고 널리 사용되는 라이브러리입니다. 파이썬으로 그림을 그리는 데 필요한 캔버스, 붓, 물감 역할을 한다고 생각하면 쉽습니다. 특히 수학 함수 그래프, 과학 데이터 시각화 등에 강력한 기능을 제공합니다.
라이브러리 가져오기 (Import)
Matplotlib, 특히 그중에서도 그래프 그리기 기능을 모아놓은 pyplot
모듈을 사용하려면 먼저 파이썬 코드로 불러와야 합니다. 관례적으로 pyplot
은 plt
라는 별칭으로 불러옵니다.
import matplotlib.pyplot as plt
그래프의 재료, x와 y 값 준비: NumPy의 도움
함수 그래프를 그리려면 그래프 위의 점들의 좌표, 즉 x값들과 그에 해당하는 y값들의 목록이 필요합니다. 부드러운 곡선을 그리려면 x 값들을 아주 촘촘하게 준비해야 합니다. 예를 들어 x가 -3부터 3까지 변하는 함수를 그린다면, x를 -3, -2, -1, 0, 1, 2, 3으로 잡는 것보다 -3.0, -2.9, -2.8, ..., 2.9, 3.0 처럼 훨씬 많은 점을 잡아야 자연스러운 곡선이 그려집니다.
수백, 수천 개의 x 값들을 손으로 만들 수는 없겠죠? 이때 NumPy 라이브러리 (Chapter 13에서 자세히 배웁니다!)가 큰 힘이 됩니다. NumPy의 linspace
함수를 사용하면 원하는 범위 내에서 균일한 간격의 숫자 배열(ndarray)을 쉽게 만들 수 있습니다. Matplotlib는 NumPy 배열과 아주 잘 작동합니다.
import numpy as np
# -3부터 3까지 균일한 간격으로 100개의 점 생성 (x 좌표들)
x_values = np.linspace(-3, 3, 100)
# 생성된 x 값들 확인 (NumPy 배열 형태)
print(x_values)
# print(len(x_values)) # 100개 생성되었는지 확인
np.linspace(시작값, 끝값, 개수)
: 시작값부터 끝값까지 포함하여 균일한 간격으로 지정된개수
만큼의 숫자를 생성하여 NumPy 배열로 반환합니다.
이제 그래프를 그릴 준비가 거의 되었습니다!
3. 나의 첫 그래프: 이차함수 y = x² 그리기
가장 친숙한 함수 중 하나인 이차함수 y = x²
의 그래프를 Matplotlib으로 그려봅시다.
import matplotlib.pyplot as plt
import numpy as np
# 1. x 값 준비: -3부터 3까지 100개의 점
x = np.linspace(-3, 3, 100)
# 2. 해당하는 y 값 계산: y = x^2
# NumPy 배열 x의 각 요소에 대해 제곱 연산을 한 번에 수행 (벡터화!)
y = x**2
# 3. 그래프 그리기: plt.plot(x좌표배열, y좌표배열)
plt.plot(x, y)
# 4. 그래프 보여주기: plt.show()
plt.show()
코드 설명:
- Matplotlib (
plt
)와 NumPy (np
) 라이브러리를 불러옵니다. np.linspace
를 이용해 그래프를 그릴 x 좌표들의 NumPy 배열x
를 생성합니다. 점의 개수(여기서는 100)가 많을수록 그래프는 더 부드러워집니다.- NumPy 배열
x
의 각 요소에 대해 제곱 연산 (**2
)을 수행하여 y 좌표들의 NumPy 배열y
를 생성합니다.for
반복문 없이 배열 전체에 연산이 적용되는 NumPy의 벡터화(Vectorization) 덕분에 코드가 간결하고 매우 빠릅니다. plt.plot(x, y)
함수는x
배열의 값들을 x좌표로,y
배열의 값들을 y좌표로 하는 점들을 순서대로 선으로 연결하여 그래프를 그립니다.plt.show()
함수는 지금까지plt
객체에 그려진 내용을 바탕으로 실제 그래프 창을 화면에 띄워 보여줍니다. (Colab이나 Jupyter Notebook 환경에서는%matplotlib inline
설정 시plt.show()
없이도 그래프가 바로 출력될 수 있습니다.)
실행 결과 (상상해보세요!)
코드를 실행하면, 원점 (0, 0)
을 꼭짓점으로 하고 아래로 볼록한 매끄러운 포물선 그래프가 그려진 새 창이 나타날 것입니다. 이것이 여러분이 파이썬으로 그린 첫 번째 함수 그래프입니다!
4. 그래프를 더 알차게: 제목, 레이블, 격자, 범례 추가하기
방금 그린 그래프는 함수의 형태는 보여주지만, 이 그래프가 무엇을 나타내는지, x축과 y축은 무엇을 의미하는지 등 추가 정보가 부족합니다. 그래프를 더 전문적이고 이해하기 쉽게 만들기 위해 여러 요소를 추가해 봅시다.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 100)
y1 = x**2
y2 = 2*x + 1 # y = 2x + 1 직선도 함께 그려봅시다
# --- 그래프 그리기 ---
# 각 plot에 label 인자를 추가하여 그래프 이름을 지정합니다.
plt.plot(x, y1, label='y = x^2')
plt.plot(x, y2, label='y = 2x + 1', linestyle='--') # linestyle을 '--'(점선)으로 변경
# --- 그래프 꾸미기 ---
plt.title('Quadratic and Linear Functions') # 그래프 전체 제목 설정
plt.xlabel('x-axis') # x축 레이블 설정
plt.ylabel('y-axis') # y축 레이블 설정
plt.grid(True) # 그래프 배경에 격자(눈금선) 표시
plt.legend() # 범례 표시 (plot에서 지정한 label들을 보여줌)
# (선택) 축 범위 조절
# plt.xlim(-4, 4)
# plt.ylim(-1, 10)
# (선택) x축, y축 표시 (검은색 실선)
plt.axhline(0, color='black', linewidth=0.5)
plt.axvline(0, color='black', linewidth=0.5)
# --- 그래프 보여주기 ---
plt.show()
추가/변경된 코드 설명:
plt.plot(..., label='이름')
: 각 그래프 선에label
인자를 통해 이름을 붙여줍니다. 이 이름은 나중에 범례에 사용됩니다.plt.plot(..., linestyle='--')
: 선의 스타일을 변경합니다.'--'
는 점선,'-'
는 실선(기본값),':'
는 매우 짧은 점선,'-.'
는 점선과 실선 조합 등 다양하게 지정할 수 있습니다.plt.title("제목")
: 그래프 상단에 전체 제목을 추가합니다.plt.xlabel("x축 설명")
,plt.ylabel("y축 설명")
: 각각 x축과 y축에 설명을 추가합니다. 단위 등을 표시할 때 유용합니다.plt.grid(True)
: 그래프 배경에 격자(눈금선)를 추가하여 특정 지점의 값을 읽기 쉽게 합니다.plt.legend()
:plot
함수에서label
로 지정된 이름들을 모아 범례 상자를 만들어 보여줍니다. 각 선이 어떤 함수를 나타내는지 알려줍니다.plt.xlim(최소, 최대)
,plt.ylim(최소, 최대)
: 그래프에 표시될 x축과 y축의 범위를 직접 지정할 수 있습니다. (주석 처리됨)plt.axhline(y값, ...)
: 지정된 y값에 수평선(horizontal line)을 그립니다. x축(y=0)을 강조할 때 유용합니다.plt.axvline(x값, ...)
: 지정된 x값에 수직선(vertical line)을 그립니다. y축(x=0)을 강조할 때 유용합니다.
이제 그래프를 보면 두 개의 함수(y=x²
와 y=2x+1
)가 명확히 구분되고, 제목, 축 설명, 격자, 범례까지 표시되어 훨씬 정보량이 풍부하고 전문적인 그래프가 되었습니다.
5. 고등학교 친구들 총출동: 다양한 함수 그래프 그리기
Matplotlib를 이용하여 고등학교 과정에서 배우는 다양한 함수들의 그래프를 직접 그려보며 각 함수의 특징을 시각적으로 확인해 봅시다.
(Tip) 그래프를 그릴 때는 함수의 특징(정의역, 치역, 주기, 점근선 등)을 고려하여 np.linspace
의 범위와 점의 개수를 적절히 조절하는 것이 중요합니다.
가. 일차함수 (y = ax + b
) - 복습 차원
x = np.linspace(-5, 5, 100)
y = -0.5*x + 2 # 기울기 -0.5, y절편 2
plt.plot(x, y, label='y = -0.5x + 2', color='green') # 색상 지정 (color='red', 'blue' 등)
plt.title('Linear Function')
plt.xlabel('x'); plt.ylabel('y') # 세미콜론(;)으로 한 줄에 여러 명령 가능
plt.grid(True); plt.legend(); plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5) # lw는 linewidth 축약형
plt.show()
나. 이차함수 (y = ax² + bx + c
) - 복습 차원
x = np.linspace(-2, 5, 400) # x 범위를 조절하여 그래프 특징(꼭짓점, 절편)이 잘 보이게
y = x**2 - 3*x - 4 # 아래로 볼록
plt.plot(x, y, label='y = x^2 - 3x - 4')
plt.title('Quadratic Function')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
# x절편 (y=0일 때 x 값)을 찾아 그래프에 점으로 표시해 볼 수도 있습니다.
roots = np.roots([1, -3, -4]) # 계수로 근 찾기 (NumPy 기능)
plt.scatter(roots, [0, 0], color='red', zorder=5, label='Roots') # zorder로 점이 선 위에 오게
plt.legend() # 범례 다시 호출하여 점 정보 추가
plt.show()
다. 지수함수 (y = a^x
)
x = np.linspace(-2, 3, 100)
y1 = 2**x # 밑이 1보다 큰 경우 (증가)
y2 = 0.5**x # 밑이 0과 1 사이인 경우 (감소)
plt.plot(x, y1, label='y = 2^x')
plt.plot(x, y2, label='y = (0.5)^x', linestyle=':')
plt.title('Exponential Functions')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
plt.show()
# x가 증가함에 따라 y가 얼마나 빠르게 증가/감소하는지, y=0 (x축)이 점근선인지 확인하세요.
라. 로그함수 (y = log_a(x)
)
# 로그 함수는 진수(x) > 0 에서만 정의됨
x = np.linspace(0.01, 5, 200) # x 범위를 0보다 약간 큰 값부터 시작해야 함
y_ln = np.log(x) # 밑이 자연상수 e인 자연로그 (ln x)
y_log10 = np.log10(x) # 밑이 10인 상용로그 (log x)
# y_log2 = np.log2(x) # 밑이 2인 로그
plt.plot(x, y_ln, label='y = ln(x)')
plt.plot(x, y_log10, label='y = log10(x)', linestyle='--')
plt.title('Logarithmic Functions')
plt.xlabel('x (x > 0)'); plt.ylabel('y')
plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5) # y축이 점근선
plt.show()
# x가 증가함에 따라 y가 얼마나 느리게 증가하는지, 밑의 크기에 따라 그래프 모양이 어떻게 다른지 비교하세요.
마. 삼각함수 (y = sin(x)
, y = cos(x)
, y=tan(x)
)
x = np.linspace(-2*np.pi, 2*np.pi, 400) # x 범위를 라디안 단위로 (-2π ~ 2π)
y_sin = np.sin(x)
y_cos = np.cos(x)
y_tan = np.tan(x)
# 탄젠트 함수는 특정 지점(π/2 + nπ)에서 무한대로 발산하므로, 불연속점을 처리해야 함
# y값이 너무 커지는 것을 방지하여 그래프 왜곡 막기
y_tan[np.abs(y_tan) > 10] = np.nan # 절댓값이 10보다 크면 NaN(Not a Number)으로 처리하여 그리지 않음
plt.plot(x, y_sin, label='y = sin(x)')
plt.plot(x, y_cos, label='y = cos(x)', linestyle='--')
plt.plot(x, y_tan, label='y = tan(x)', linestyle=':', color='green')
plt.title('Trigonometric Functions')
plt.xlabel('x (radians)'); plt.ylabel('y')
plt.ylim(-2, 2) # y축 범위 제한 (탄젠트 때문에)
plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
plt.show()
# sin, cos의 주기성(2π), 진폭(1), 위상차(π/2)를 확인하세요.
# tan의 주기성(π)과 점근선(π/2 + nπ)을 확인하세요.
바. 유리함수 (y = 1/x
) 와 무리함수 (y = sqrt(x)
)
# 유리 함수 (y = 1/x)
x_rat_neg = np.linspace(-4, -0.1, 100) # x=0 피해서 음수 구간
x_rat_pos = np.linspace(0.1, 4, 100) # x=0 피해서 양수 구간
y_rat_neg = 1 / x_rat_neg
y_rat_pos = 1 / x_rat_pos
plt.figure(figsize=(10, 4)) # 그래프 크기 조절 (가로 10, 세로 4 인치)
plt.subplot(1, 2, 1) # 1행 2열 중 첫 번째 그래프 영역
plt.plot(x_rat_neg, y_rat_neg, color='blue')
plt.plot(x_rat_pos, y_rat_pos, color='blue', label='y = 1/x')
plt.title('Rational Function')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5) # 점근선
# 무리 함수 (y = sqrt(x))
x_irr = np.linspace(0, 9, 100) # 정의역 x >= 0
y_irr = np.sqrt(x_irr) # NumPy의 제곱근 함수
plt.subplot(1, 2, 2) # 1행 2열 중 두 번째 그래프 영역
plt.plot(x_irr, y_irr, label='y = sqrt(x)', color='purple')
plt.title('Irrational (Radical) Function')
plt.xlabel('x (x >= 0)'); plt.ylabel('y (y >= 0)'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
plt.tight_layout() # 그래프들이 겹치지 않게 자동 조정
plt.show()
plt.figure(figsize=(w, h))
: 전체 그래프 그림(figure)의 크기를 가로w
인치, 세로h
인치로 지정합니다.plt.subplot(행, 열, 번호)
: 하나의 figure 안에 여러 개의 그래프(subplot)를 그릴 때 사용합니다. 영역을 행x열 격자로 나누고 그중 몇 번째 영역에 그릴지 지정합니다.plt.tight_layout()
: 여러 subplot들의 제목, 레이블 등이 겹치지 않도록 자동으로 간격을 조절해줍니다.
6. 그래프로 보는 함수의 변환
함수의 평행이동, 대칭이동, 확대/축소는 수식으로 배우지만, 그래프로 직접 그려보면 그 효과를 훨씬 명확하게 이해할 수 있습니다.
가. 평행이동: y = f(x - p) + q
y = x²
그래프를 x축 방향으로 2만큼, y축 방향으로 3만큼 평행이동시킨 y = (x - 2)² + 3
그래프를 함께 그려봅시다.
x = np.linspace(-1, 5, 100)
y1 = x**2
y2 = (x - 2)**2 + 3 # x 대신 (x-2), 결과에 +3
plt.plot(x, y1, label='$y = x^2$') # 수식 표현: $...$ 사용 (LaTeX 문법)
plt.plot(x, y2, label='$y = (x-2)^2 + 3$', linestyle='--')
plt.scatter([0, 2], [0, 3], color='red', zorder=5) # 꼭짓점 이동 표시
plt.text(0.1, 0.1, '(0, 0)') # 텍스트 추가
plt.text(2.1, 3.1, '(2, 3)')
plt.title('Parallel Translation (Shift)')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axis('equal') # x축과 y축의 스케일을 같게 하여 이동 거리를 정확히 봄
plt.show()
그래프를 보면 y = x²
의 꼭짓점 (0, 0)
이 y = (x-2)² + 3
에서는 (2, 3)
으로 정확히 이동한 것을 시각적으로 확인할 수 있습니다.
나. 대칭이동
- x축 대칭:
y = -f(x)
- y축 대칭:
y = f(-x)
- 원점 대칭:
y = -f(-x)
y = sqrt(x)
함수를 예로 들어 대칭 이동을 시각화해 봅시다.
x = np.linspace(0, 4, 100)
y_orig = np.sqrt(x)
y_x_reflected = -np.sqrt(x) # x축 대칭
y_y_reflected = np.sqrt(-x + 1e-9) # y축 대칭 (정의역 x<=0 이므로 x 범위 수정 필요)
# 1e-9는 0에서 sqrt 계산 오류 방지용 작은 값
x_neg = np.linspace(-4, 0, 100) # y축 대칭용 x 범위
y_y_reflected_plot = np.sqrt(-x_neg)
y_origin_reflected = -np.sqrt(-x_neg) # 원점 대칭
plt.plot(x, y_orig, label='$y = \sqrt{x}$')
plt.plot(x, y_x_reflected, label='$y = -\sqrt{x}$ (x-axis reflection)', linestyle='--')
plt.plot(x_neg, y_y_reflected_plot, label='$y = \sqrt{-x}$ (y-axis reflection)', linestyle=':')
plt.plot(x_neg, y_origin_reflected, label='$y = -\sqrt{-x}$ (origin reflection)', linestyle='-.')
plt.title('Symmetry Transformations')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
# plt.axis('equal') # 필요시 사용
plt.show()
다. 확대/축소: y = a * f(x)
및 y = f(b * x)
y = sin(x)
함수를 예로 들어 y축 방향 확대/축소 (a
) 와 x축 방향 확대/축소 (b
) 효과를 봅시다.
x = np.linspace(0, 2*np.pi, 200)
y1 = np.sin(x)
y2 = 2 * np.sin(x) # y축 방향 2배 확대 (진폭 2배)
y3 = 0.5 * np.sin(x) # y축 방향 1/2배 축소 (진폭 1/2배)
y4 = np.sin(2 * x) # x축 방향 1/2배 축소 (주기 절반)
y5 = np.sin(0.5 * x) # x축 방향 2배 확대 (주기 2배)
plt.plot(x, y1, label='$y = sin(x)$')
plt.plot(x, y2, label='$y = 2sin(x)$', linestyle='--')
# plt.plot(x, y3, label='$y = 0.5sin(x)$', linestyle=':')
plt.plot(x, y4, label='$y = sin(2x)$', linestyle='-.')
# plt.plot(x, y5, label='$y = sin(0.5x)$', linestyle='dotted')
plt.title('Scaling Transformations of Sine Function')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5)
plt.show()
y = a * f(x)
:|a| > 1
이면 y축 방향으로 확대,0 < |a| < 1
이면 축소됩니다.a
는 진폭에 영향을 줍니다.y = f(b * x)
:|b| > 1
이면 x축 방향으로1/|b|
배 축소,0 < |b| < 1
이면1/|b|
배 확대됩니다.b
는 주기에 영향을 줍니다 (원래 주기 / |b|).
7. 그래프 탐구를 통한 수학적 통찰
이제 여러분은 파이썬과 Matplotlib를 이용하여 다양한 함수의 그래프를 그리고, 그 변환까지 시각적으로 탐구할 수 있게 되었습니다. 그래프를 적극적으로 활용하여 다음을 파악하는 연습을 하세요.
- 함수의 증가/감소 구간: 그래프가 오른쪽 위로 향하는지, 아래로 향하는지 관찰합니다.
- 극대/극소점: 그래프가 위로 볼록에서 아래로 볼록으로 변하는 지점 근처(극대) 또는 그 반대(극소)를 찾습니다. (미분과 관련)
- 최댓값/최솟값: 주어진 범위 내에서 그래프가 가장 높은 지점과 낮은 지점을 찾습니다.
- x절편(근) / y절편: 그래프가 x축과 만나는 점(y=0)과 y축과 만나는 점(x=0)을 찾습니다. 방정식의 해와 관련 있습니다.
- 점근선: 유리함수, 로그함수, 탄젠트함수 등에서 그래프가 특정 직선에 한없이 가까워지는 모습을 관찰합니다.
- 주기성: 삼각함수처럼 일정한 패턴이 반복되는지, 그 반복되는 구간(주기)의 길이는 얼마인지 확인합니다.
직접 해보기 (Follow Along Exercise)
절댓값 함수 y = |x - 1|
의 그래프를 그려보세요. np.abs()
함수를 사용할 수 있습니다. 그래프가 뾰족한 점(미분 불가능한 점)이 어디인지 확인해보세요.
# 직접 코드를 작성해보세요!
x = np.linspace(-2, 4, 200)
y = np.abs(x - 1)
plt.plot(x, y, label='y = |x - 1|')
plt.title('Absolute Value Function')
plt.xlabel('x'); plt.ylabel('y'); plt.grid(True); plt.legend()
plt.axhline(0, color='black', lw=0.5); plt.axvline(0, color='black', lw=0.5)
plt.scatter(1, 0, color='red', zorder=5, label='Vertex (1, 0)') # 뾰족점 표시
plt.legend()
plt.show()
그래프를 보면 x = 1
에서 V자 모양으로 꺾이며 뾰족한 점이 생기는 것을 확인할 수 있습니다. 이 지점에서는 미분계수가 정의되지 않습니다.
연습 문제
- 가우스 함수(최대 정수 함수)
y = floor(x)
의 그래프를-3 <= x <= 3
범위에서 그려보세요. NumPy의np.floor()
함수를 사용하고, 계단 모양이 잘 보이도록plt.plot
대신plt.step(x, y)
를 사용해 볼 수도 있습니다. - 함수
f(x) = x³ - 2x² + 1
의 그래프를 그리고,x=1
에서의 접선을 함께 그려보세요. (접선의 기울기는 Chapter 12에서 배울 미분으로 구하거나, Chapter 14의 SymPy를 이용할 수 있습니다. 여기서는 시각화에 집중하여 대략적인 접선을 그려보는 것도 좋습니다.) y = 2cos(x)
와y = cos(2x)
의 그래프를-2π <= x <= 2π
범위에서 함께 그리고, 두 함수의 주기와 진폭의 차이를 설명하세요.
이번 장에서는 Matplotlib를 이용하여 함수의 그래프를 그리고 해석하는 강력한 방법을 배웠습니다. 그래프는 추상적인 함수 개념을 시각적으로 이해하고 탐구하는 데 매우 중요한 도구입니다. 다음 장에서는 파이썬을 이용해 점, 직선, 원 등 기본적인 기하 도형들을 다루고 시각화하는 방법을 알아보겠습니다.
COMMENTS