高校向けPython入門(12) 斜方投射
モデル化とシミュレーションの題材は,教科書によってすこしずつ異なる。 斜方投射については,「情報の科学」で少しだけ扱っているものが1冊あった(教科書見本がきていたものだけ)
文科省の「高等学校情報科「情報Ⅰ」教員研修用教材」には載っている。物理の授業でも扱う基本的なものだ。
物体を水平面となす角が 𝜃 であるように斜めに投げ上げるとき、物体が描く軌跡を表示する。
初速を 𝑣 とすると,𝑡 秒後の位置は,𝑡 を媒介変数として,𝑥 = 𝑣 cos 𝜃 · 𝑡, 𝑦 = 𝑣 sin 𝜃 · 𝑡 − 𝑔𝑡^2/2 で表される。
初速を設定し,投射角を変えたものをいくつか表示しよう。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(11,4))
plt.axes()
plt.axis([0,11,0,4])
g = 9.8 # 重力加速度
# 角 th を与えて軌跡を描く関数を定義
def proj(th):
t = np.linspace(0,time,101)
x = v * np.cos(th) * t
y = v * np.sin(th) * t - 1/2*g*t**2
plt.plot(x,y)
v = 8 # 初速 10前後で変えてみよう
time = 1 # この時刻まで表示する。この値を変えてみよう
proj(np.pi/6) # 投射角を指定して投げる これも変えてみよう
proj(np.pi/4)
proj(np.pi/3)
plt.text(8,3.5,'v = ' + str(v) + ' m/s',fontsize = 16)
plt.text(8,3,'time = ' + str(time) + ' s',fontsize = 16)
plt.show()
3 つの曲線の色は自動的に決まるが,color オプションをつけて指定してもよい。 v = 10 にすると次のようになる。
斜方投射における物体の位置や,地面に到達する時刻,飛んだ距離などは式から計算できるわけだが,このようにすると初速による軌道の違いや角度による到達距離などがイメージ しやすくなる。
さらに,これをアニメーションにしてみよう。次のコードを追加し後ろの方を 関数 update に入れるように修正する。
%matplotlib notebook
import matplotlib.animation as animation
def update(frame):
time = frame / 20 # 20は適当に設定した値。変えると動きが変わる
plt.cla() # 現在描写されているグラフを消去
plt.xlim(0,11) # 横軸の範囲はここで指定
plt.ylim(0,4) # 縦軸の範囲
proj(np.pi/6,time)
proj(np.pi/4,time)
proj(np.pi/3,time)
movie = animation.FuncAnimation(fig, update, interval = 120,frames = 40)
plt.show()
1 行目の %matplotlib notebook は,Jupyter Notebook でアニメーションを表示するた めに必要なものだ。IDLE では必要ない。
やはり,アニメーションのほうが比較しやすい。