はじめに
質量の異なる2つのボールを使い、重いボールを下にして重ねて落下させると、上の軽いボールが高く跳ね上がる現象を「すっとびボール」といいます。この現象は「多段式垂直衝突球」「ガリレオ砲」「ボールピラミッド」などとも呼ばれています。本記事では、matplotlibのFuncAnimationを使ってこの興味深い物理現象をアニメーションで可視化します。
コード
解説
モジュールのインポートなど
バージョン
時間データの作成
np.arangeを使用して0から15秒まで0.05秒間隔で時間データを作成します。この配列のサイズは300になります。
重力加速度は9.8 m/s²としています。
下のボールの位置変化
初期位置を100とした場合、位置は自由落下の法則に従って変化します。
np.where(b1_z==0)[0][0]を使用して、位置が0になった最初のインデックスを特定します。
b1_z[b1_z_posi0_ind:]=0により、ボールが地面に接触した(位置が0になった)インデックス以降のすべての位置データを0に設定します。
上のボールの位置変化
大ボールと床の反発係数、および大ボールと小ボールの反発係数をともに1とした場合、大ボールの質量が小ボールの質量の3倍のとき、衝突後の小ボールの速度は衝突前の2倍になります。
衝突後の初速をv2_posi0とすると、小ボールの位置(b2_z)は-v2_posi0t – 1/2g*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を使用してアニメーションを表示します。フレーム数300、インターバル20msに設定し、6秒間のアニメーションを作成します。
HTML(ani.to_html5_video())
を実行すると、Jupyter NotebookまたはJupyter Lab上で直接アニメーションを表示できます。
また、ani.save(‘ファイル名’, writer=”ffmpeg”, dpi=100)を使用すれば、アニメーションをMP4形式で保存できます。
コードをダウンロード(.pyファイル) コードをダウンロード(.ipynbファイル)参考

コメント