ボールを上から落とすと、地面で跳ね返って、また落ちる。当たり前の動きだけど、「ボールがどう動くか」を自分でプログラムすると、地球の重力ってすごいんだなと感じます。
学校で習ったことを思い出そう
- 重力:地球が物を引っぱる力
- 重力加速度 g:物が落ちる速さの増え方(地球では g = 9.8 m/s²)
- 速さ vs 加速度:速さは「どれだけ動いてるか」、加速度は「速さがどれだけ増えてるか」
Step 1: ボールが落ちるしくみ
コマ送りで考えるよ。1コマごとに:
- 1ボールの位置を、いまの速さだけ動かす
- 2ボールの速さを、重力の分だけ増やす(下方向に)
- 3もし地面についたら、速さを反転(跳ね返り)
Step 2: 実装
colab で アニメ表示
Python
import matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationfrom IPython.display import HTML
# 初期設定y = 100 # 高さ(最初は100の位置から落とす)vy = 0 # 速さ(最初は0、落ちてない)gravity = 9.8 # 重力加速度dt = 0.1 # 1コマあたりの時間bounce = 0.8 # 跳ね返り係数(0.8 = 80%の高さまで跳ねる)
fig, ax = plt.subplots(figsize=(6, 6))ax.set_xlim(-1, 1)ax.set_ylim(0, 110)dot, = ax.plot([0], [y], "o", markersize=20, color="orange")
def update(frame): global y, vy vy = vy - gravity * dt # 下向きに加速 y = y + vy * dt # 速さの分だけ位置を変える if y <= 0: y = 0 vy = -vy * bounce # 跳ね返り(速さが反転+ちょっと小さく) dot.set_data([0], [y]) return dot,
ani = FuncAnimation(fig, update, frames=200, interval=50, blit=True)HTML(ani.to_jshtml())実行すると...
ボールがふわっと落ちて、地面でぽよーんと跳ねて、だんだん小さくなって止まるよ。3D ゲームのような動きが、20行のコードで作れる!
Step 3: 月と火星でも跳ねさせる
重力は星によって違います:
| 星 | 重力 (m/s²) | 地球の何倍 | 結果 |
|---|---|---|---|
| 地球 | 9.8 | 1.0 | ふつうに跳ねる |
| 月 | 1.6 | 0.16 | ゆっくり、高く跳ねる |
| 火星 | 3.7 | 0.38 | 中間 |
| 木星 | 24.8 | 2.5 | あっという間に止まる |
コードの `gravity = 9.8` を変えるだけで、月や火星にいる気分になれます。
やってみよう
- `gravity` を 1.6(月)にしてみる:跳ねが大きくなるのを観察
- `bounce` を 1.0 にしてみる:減らないボール!永遠に跳ね続ける
- `bounce` を 0.5 にしてみる:すぐ止まるボール
- ボールを2つにしてみる:別の重力でレースさせる
おうちの人・先生へ
中学3年の物理「運動とエネルギー」、高校物理基礎「等加速度運動」の入口として最適。「位置 + 速さ × 時間」「速さ + 加速度 × 時間」というオイラー法(数値計算の最も基本)を、無意識のうちに実装する経験になります。
に頼んでみよう
発展課題のプロンプト例
小学6年生の子と Python でボールが跳ねるアニメを作りました。
重力を変えると月や火星みたいになるのが面白かったみたいです。
次は、ボールを「斜めに投げる」アニメも作ってみたいです。
小学生でも理解できるコードと、何が起きてるかの解説をお願いします。 想定される実行結果(例示)
小学生でも分かる「斜めに投げる」プログラムを書きます。
## ポイント
横と縦、別々の動きを足すだけ!
- 横向きの速さ: 一定(重力は縦にしか効かない)
- 縦向きの速さ: 重力で減っていく
## コード
```python
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
x, y = 0, 0 # スタート地点
vx, vy = 5, 15 # 横向き5、縦向き15で投げる
gravity = 9.8
dt = 0.1
fig, ax = plt.subplots()
ax.set_xlim(0, 50)
ax.set_ylim(0, 15)
dot, = ax.plot([x], [y], "o", markersize=15, color="orange")
def update(frame):
global x, y, vx, vy
x += vx * dt # 横は普通に進む
vy -= gravity * dt # 縦は重力で速さが減る
y += vy * dt
if y < 0: y = 0 # 地面で止める
dot.set_data([x], [y])
return dot,
```
実行すると、ボールが**山なり**に飛ぶよ。これが「放物運動」!次回予告
次回は、自分の住んでる町の今の天気を、パソコンに教えてもらいます。気象庁から本物のデータがやってくるよ!
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。