[matplotlib animation] 80.すっとびボール

matplotlib

はじめに

質量の異なるボールを2つ使って、質量の大きい方を下にして重ねて落下させた場合に、一番上のボールが高く跳ね上がる現象のことをすっとびボールという。別名として、多段式垂直衝突球、ガリレオ砲、ボールピラミッドなどがある。matplotlibのFuncAnimationでこの現象をアニメーションで表示する。

コード

コードをダウンロード(.pyファイル)コードをダウンロード(.ipynbファイル)

解説

モジュールのインポートなど

バージョン

時間データの作成

np.arangeで15sまで0.05刻みで時間データを作成する。配列のサイズは300となる。
重力加速度は9.8 m/sとした。

下のボールの位置変化

初期位置を100とした場合、位置は自由落下により変化する。
np.where(b1_z==0)[0][0]で0となったときのindexを求める。
b1_z[b1_z_posi0_ind:]=0で位置が0になったインデックス以降のデータを0とする。

上のボールの位置変化

大ボールと床の反発係数,大ボールと小ボールの反発係数をともに1とし、大ボールの質量が小ボールの質量の3倍のとき、衝突後の小ボールの速度は衝突前の2倍となる。

衝突後の初速をv2_posi0とすると、位置(b2_z)は-v2_posi0*t – 1/2*g*t**2で表される。

衝突前の動きは下ボールと同じなので、np.concatenateで結合し、[:t.shape[0]]でスライスしてサイズを揃える。

位置の変化を図示

アニメーションで表示

アニメーション時にボールが重なるので、各ボールの位置を少しずらす。

ax.hlines(0,-.25,.25)でy=0の位置に平行線を表示する。
ax.spines[‘right’].set_visible(False)などで左以外の軸を消す。

アニメーション関数の設定

set_ydataで各plotのydataをセットする。

アニメーションの表示

FuncAnimationでアニメーションを表示する。frame数を300、intervalを20msとし、6秒のアニメーションとする。
HTML(ani.to_html5_video())により、jupyter notebook またはjupyter lab上にアニメーションを表示できる。

ani.save(‘ファイル名’, writer=”ffmpeg”,dpi=100)でアニメーションをMP4形式で保存することができる。

参考

すっとびボール - Wikipedia

コメント