ふくふくHukuhuku Inc.
EP.04STEM対象: 中3以上 13分公開: 2026-05-10

太陽系を回そう:万有引力とケプラーの法則

万有引力とニュートン運動方程式から、惑星の公転軌道を自分のパソコンで計算する。ケプラーの3法則を可視化。

#中高生#天文#物理#万有引力
CO📔 Google Colab で開く(上から順にセルを実行)
シェア

ケプラーの3法則」「万有引力 F = G m₁m₂/r²」、教科書では文字や式で覚えますが、Python で太陽系を実際に動かしてみると、なぜそうなるのかが直感的に見えてきます。

ケプラーの3法則(おさらい)

  1. 1第1法則:惑星は太陽を1焦点とする楕円軌道を描く
  2. 2第2法則:惑星と太陽を結ぶ線分が単位時間に描く面積は一定(面積速度一定)
  3. 3第3法則:公転周期² ∝ 軌道長半径³

Step 1: 万有引力で2体問題を解く

太陽(質量 M)から距離 r にある惑星(質量 m)には、太陽方向に引力 F = GMm/r² が働く。これを Python で時間刻み dt ごとに更新します。

地球の公転シミュレーション
Python
import numpy as npimport matplotlib.pyplot as pltfrom matplotlib.animation import FuncAnimationfrom IPython.display import HTML
# 単位を「天文単位」「年」「太陽質量」で表記GM = 4 * np.pi**2  # 太陽の引力定数(天文単位/年² で 4π²)
# 地球の初期状態x, y = 1.0, 0.0      # 太陽から1天文単位vx, vy = 0.0, 2 * np.pi  # 公転速度(円軌道なら 2π/年)
dt = 0.01
fig, ax = plt.subplots(figsize=(6, 6))ax.set_xlim(-1.5, 1.5); ax.set_ylim(-1.5, 1.5)ax.scatter([0], [0], s=200, color="orange", label="太陽")trace, = ax.plot([], [], "b-", linewidth=0.5)planet, = ax.plot([x], [y], "o", color="blue", markersize=10)
xs, ys = [x], [y]
def step(frame):    global x, y, vx, vy    r2 = x**2 + y**2    r = np.sqrt(r2)    # 万有引力    ax_g = -GM * x / r**3    ay_g = -GM * y / r**3    vx += ax_g * dt; vy += ay_g * dt    x += vx * dt; y += vy * dt    xs.append(x); ys.append(y)    trace.set_data(xs, ys)    planet.set_data([x], [y])    return trace, planet
ani = FuncAnimation(fig, step, frames=300, interval=30, blit=True)HTML(ani.to_jshtml())
万有引力で計算した3惑星(水星・地球・火星)の公転軌道
万有引力 F=GM/r² の数値積分だけで、それぞれの公転軌道が出る
実行すると

青い点(地球)が太陽の周りを楕円軌道で回ります。1周がだいたい1年(自然単位系で)になっているのが確認できます。

Step 2: 軌道を変えて楕円に

初期速度を変えると、軌道の形が変わります:

初期速度 vy軌道解釈
2π × 0.7つぶれた楕円近日点で速い
2π(円速度)等速円運動
2π × 1.2伸びた楕円遠日点で遅い
2π × √2 ≈ 8.89放物線脱出速度(戻ってこない)
10以上双曲線完全に逃げる

Step 3: ケプラーの第3法則を確認

複数惑星で T² ∝ a³ を検証
Python
import numpy as np
# 太陽系の主要惑星のデータplanets = {    "水星": {"a": 0.387, "T": 0.241},    "金星": {"a": 0.723, "T": 0.615},    "地球": {"a": 1.000, "T": 1.000},    "火星": {"a": 1.524, "T": 1.881},    "木星": {"a": 5.203, "T": 11.86},    "土星": {"a": 9.537, "T": 29.46},}
import matplotlib.pyplot as pltxs, ys, names = [], [], []for name, p in planets.items():    xs.append(p["a"]**3); ys.append(p["T"]**2)    names.append(name)
plt.figure(figsize=(8, 6))plt.loglog(xs, ys, "o-", markersize=10)for x, y, name in zip(xs, ys, names):    plt.annotate(name, (x, y), fontsize=11)plt.xlabel("軌道長半径 a の3乗 (天文単位³)")plt.ylabel("公転周期 T の2乗 (年²)")plt.title("ケプラーの第3法則: T² ∝ a³")plt.grid(True)plt.show()
太陽系6惑星のa³とT²を両対数でプロットした結果、見事に直線になる
T²/a³ が一定(傾き=1の直線)であることが視覚的に確認できる

両対数プロットで直線になり、傾きが1(つまり T² = a³)であることが確認できます。これがケプラーの第3法則。

次回予告

EP.05 は波動の世界。音をして、ドミソの和音が3つの周波数に分解できることを実験します。

シェア

この記事の感想を教えてください

あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。

シリーズの外も探す:

まずは、現状を聞かせてください。

要件が固まっていなくて大丈夫です。現状診断と方針提案までを無料でお手伝いします。

無料相談フォームへ hello [at] hukuhuku [dot] co [dot] jp