[Python에 의한 과학 · 기술 계산] 포물 운동의 애니메이션을 궤적 (locus)으로 그리기, matplotlib

소개



matplotlib의 ArtistAnimation 메소드를 사용하여,
포물 운동을 행하는 물체의 운동을 궤적도 붙이면서 표시한다.
여기서는 궤적 부분과 물체의 운동 부분의 두 그림을 겹쳐서 표시하는 방법을 사용하였다.
누구나 생각하는 간단하고 쉬운 방법이지만, 살짝 시각화하고 싶을 때는 도움이 될지도 모른다. .

내용



$y$ 방향으로 균일한 중력장에서 각도 $\theta$ 방향으로 수직 던지는 문제이다.

시간 $t = 0$일 때 질점의 위치를 ​​$(x_0,y_0)$, 초속도의 크기를 $V_0$로 하면 시간 $t$에서의 질점의 $x(t)$ 및 $y(t )$좌표는 다음과 같다. 이 질점의 운동은 포물선을 그립니다.
$x(t) = x_0 + V_0\cos(\theta)$
$y(t)= y_0 + V_0\sin(\theta)-0.5\\g\t^2$

이 문제에서는 $V_0 = 100$ m/s, $(x_0, y_0)=(0, 0)$, $\theta=\pi/4$ (=45도)로 설정하여 질점 운동을 그립니다. .

코드



locus.py
"""
軌跡付きの放物運動のアニメーション
Animation with a locus
"""

import matplotlib.pyplot as plt
%matplotlib nbagg  # Jupyter-notebookでアニメーションを表示する場合に付け加える
from matplotlib.animation import ArtistAnimation # アニメーション作成のためのメソッドをインポート
import numpy as np

fig = plt.figure()

anim = [] #アニメーション用に描くパラパラ図のデータを格納するためのリスト
tt = np.arange(0,15,0.5) # 描画するための時間設定: t=0から15までの0.5刻み。

x_all=[] # 全てのx位置のデータを格納するためのリスト
y_all=[] # 全てのy位置のデータを格納するためのリスト

#初期条件の設定
V0 =100 # 初速度の大きさ: 100 m/s
theta=np.pi/4
x0=0 # 初期位置: x=0
y0=0 #初期位置: y = 0
g=9.8 # 重力定数 [m/s^2]

for t in tt:
    x= [V0*np.cos(theta)*t+x0]  # x(t)の記述
    y = [-( g/2)*t**2+V0*np.sin(theta)*t+y0] # y(t)の記述
    x_all.append(x[0]) # xの時々刻々データを格納
    y_all.append(y[0]) # yの時々刻々データを格納

    # 時刻tにおける質点と,時刻tに至るまでの運動の軌跡の二つの絵を作成し, アニメーション用のリストに格納する。
    im=plt.plot(x,y,'o', x_all,y_all, '--', color='red',markersize=10, linewidth = 2, aa=True)
    anim.append(im)


anim = ArtistAnimation(fig, anim) # アニメーション作成

# 描画のカスタマイズ
plt.xlabel('X',fontsize=18) # 
plt.ylabel('Y',fontsize=18)
plt.xlim(0, 1100)
plt.ylim(-10,300)
plt.hlines([0], 0, 2000, linestyles="-")  # y=0に線を描く。

fig.show() 
anim.save("t.gif", writer='imagemagick')   #アニメーションをt.gifという名前で保存し,gifアニメーションファイルを作成する。


결과





대각선 45도 방향으로 초속 100m/s로 던졌을 경우의 질점의 운동의 애니메이션을 궤적 첨부로 표시한 것.

수정 / 변경 로그 :



2017년 8월 3일: y(t) 중의 질량 m을 제거하였다. T_시나지 님, 지적 해 주셔서 감사합니다!

2017년 8월 10일: anim.save("t.gif")→ anim.save("t.gif", writer='imagemagick')로 변경했다. yoddy 님, 지적 해 주셔서 감사합니다!

참고문헌



ArtistAnimation의 경우,
chez_sugi의 matplotlib로 애니메이션
를 참고로 했습니다.

좋은 웹페이지 즐겨찾기