[matplotlib animation] 80.すっとびボールのシミュレーション

matplotlib

はじめに

質量の異なる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ファイル)

参考

すっとびボール - Wikipedia

コメント