はじめに
質量の異なるボールを2つ使って、質量の大きい方を下にして重ねて落下させた場合に、一番上のボールが高く跳ね上がる現象のことをすっとびボールという。別名として、多段式垂直衝突球、ガリレオ砲、ボールピラミッドなどがある。matplotlibのFuncAnimationでこの現象をアニメーションで表示する。
コード
解説
モジュールのインポートなど
バージョン
時間データの作成
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形式で保存することができる。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)
コメント