방향도 작성 (Direction Plot)
import numpy as np import matplotlib.pyplot as plt plt.rcParams['font.family'] = "Nanumgothic" plt.rcParams['axes.unicode_minus'] = False
방향도를 작성할 식을 함수로 작성합니다.
def dv_dt(t, v): return 9.8-v/5
방향도를 그릴 (t, v) 평면의 격자점을 생성. meshgrid() 함수를 사용하여 각 (t, v) 쌍을 생성
t_min, t_max=0, 10 v_min, v_max=40, 60 t_interval=1 v_interval = 4 t=np.arange(t_min, t_max+t_interval, t_interval) v=np.arange(v_min, v_max+v_interval, v_interval) T, V=np.meshgrid(t, v)
각 (t, v) 격자점에서 dv/dt 값 계산, 이 값은 각 지점에서의 기울기입니다.
slope=dv_dt(T, V)
quiver()
함수는 화살표의 (x, y)위치와 (x방향 성분, y 방향성분)을 인자로 받습니다. 화살표의 길이를 일정하게 유지하면서 방향만 표시하기 위해 각 기울기값(slope)를 단위 벡터로 정규화합니다.
- u=1(t 방향성분)
- w=slope(v 방향성분)
이때 화살표의 길이(L)을 일정하게 하고 방향만 유지하기 위해 u, w를 정규화 합니다.
- L=np.sqrt(1**2+slope**2)
- u=1/L
- w=slope/L
하지만 quiver 함수는 scale 인자를 사용하여 화살표의 길이를 조절할 수 있으므로, 단순히 U=1과 W=slopes로 설정하고 scale을 조정하는 것이 더 직관적일 수 있습니다. 여기서는 scale을 사용하여 화살표의 상대적인 길이를 조절해 보겠습니다.
U=np.ones_like(T) W=slope L=np.sqrt(U**2+W**2) U_norm=U/L W_norm=W/L
plt.figure(figsize=(4,3)) plt.quiver(T, V, U_norm, W_norm, color="b", scale=20,headwidth=4, headlength=4) plt.axhline(49, color="g", alpha=0.6) plt.xlabel("t(시간)") plt.ylabel("v(속도)") plt.grid(True, ls="--", alpha=0.7) plt.show()
위 과정을 하나의 함수로 작성합니다.
def directionPlot(f, x, y, x_interval, y_interval, xlab, ylab, color="b", scale=20,headwidth=4, headlength=4 ): x=np.arange(x[0], x[1]+x_interval, x_interval) y=np.arange(y[0], y[1]+y_interval, y_interval) X, Y=np.meshgrid(x, y) slope=f(X, Y) U=np.ones_like(X) W=slope L=np.sqrt(U**2+W**2) U_norm=U/L W_norm=W/L plt.figure(figsize=(4,3)) plt.quiver(X, Y, U_norm, W_norm, color=color, scale=scale,headwidth=headwidth, headlength=headlength) plt.xlabel(xlab) plt.ylabel(ylab) plt.grid(True, ls="--", alpha=0.7)
댓글
댓글 쓰기