力学的エネルギー保存の法則

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

力学的エネルギー保存の法則

今回の記事では エネルギー とよばれる量を導入します。エネルギーに関する詳細な議論は先の記事で扱いますが、当面の間は運動エネルギーと位置エネルギーの定義式を天下り的に使いながら、数値シミュレーションを通してその性質を探っていきます。

運動エネルギーと位置エネルギー

質量 $m$ [kg] をもち、速度 $v$ [m/s] で運動する物体の 運動エネルギー
 \[K=\frac{1}{2}mv^2\tag{1}\]
で与えられます。また、物体が置かれた天体 (惑星または衛星) の表面付近における重力加速度が $g$ [m/s2] であるとき、地面から高さ $h$ まで持ち上げられた質量 $m$ の物体のもつ 位置エネルギー (ポテンシャルエネルギー)
 \[U=mgh\tag{2}\]
で定義されます ($g$ は重力加速度)。運動エネルギーと位置エネルギーの和を力学的エネルギーとよびます。
 \[E=K+U=\frac{1}{2}mv^2+mgh\tag{3}\]
エネルギーは [kg] × [m/s2] × [m]、すなわち [kg・m2/s2] の単位をもちます。
この単位をジュールと定義して、J という記号で表します。

力学的エネルギー保存の法則

前回記事に続いて月面における自由落下運動を考察しますが、位置エネルギーを計測しやすいように、座標軸の設定を変えることにします。$y$ 軸の原点を月面上にとり、ボールを離す高さを $y=h$ [m] とします。このとき自由落下の運動方程式は
 \[m\frac{d^2 y}{dt^2}=-mg\tag{4}\]
で与えられます。前回記事とはボールにはたらく重力の符号が逆になっていることに注意してください。両辺から $m$ を落とします。
 \[\frac{d^2 y}{dt^2}=-g\tag{5}\]
両辺を積分すると速度の式が得られます。
 \[\frac{dy}{dt}=-gt+C\tag{6}\]
もう一度積分すると高度が得られます。
 \[y=-\frac{1}{2}gt^2+Ct+D\tag{7}\]
初期条件 $y'(0)=0,\ y(0)=h$ によって積分定数 $C$ と $D$ が定まります。すなわち
 \[\begin{align*}&0+C=0\tag{8}\\[6pt]&0+0+D=h\tag{9}\end{align*}\]
より $C=0,\ D=h$ となるので、速度 $v=dy/dt$ および高度 $y$ は
 \[\begin{align*}&\frac{dy}{dt}=-gt\tag{10}\\[6pt]&y=h-\frac{1}{2}gt^2\tag{11}\end{align*}\]
で与えられます。$v$ と $y$ を介して運動エネルギーと位置エネルギーを時間の関数として表すことができます。

高度 $h=10000$ m からボールを落下させてみましょう。ボールの質量は $m=0.15$ kg とします (硬式野球で使用されるボールと同じ質量です)。横軸に時刻 $t$、縦軸にボールの運動エネルギーと位置エネルギーをプロットしてみると、興味深い結果が得られます。

# File_Mechanics_02

# In[1]

import numpy as np
import matplotlib.pyplot as plt

# 月面付近の重力加速度
g = 1.62

# ボールの質量
m = 0.15

# 高度の初期設定
h = 1e4

# ボールが地面に到達する時間
t_max = np.sqrt(2*h/g)

# 落下時間
t = np.linspace(0, t_max, 129)

# 落下速度
v = - g * t

# 高度
y = h - (g * t**2) / 2

# 運動エネルギー
K = (m * v**2) / 2

# 位置エネルギー
U = m * g * y

# FigureとAxesの設定
fig, ax = plt.subplots(figsize=(6.5, 4))
ax.set_title("Energy vs time", fontsize=16, pad=10)
ax.grid()
ax.set_xlim(0, max(t))
ax.set_ylim(0, max(U)*1.2)
ax.set_xlabel("t [s]", fontsize=14, labelpad=8)
ax.set_ylabel("K, U [J]", fontsize=14, labelpad=8)

# K,U,K+Uの時間変化をプロット
ax.plot(t, K, color="red", label="K")
ax.plot(t, U, color="blue", label="U")
ax.plot(t, K + U, color="black", linestyle="--", label="K + U")

# 凡例を表示
ax.legend(loc=(0.05, 0.1))

plt.show()

Python 運動エネルギーと位置エネルギー、力学的エネルギー保存則
赤いラインが運動エネルギー、青いラインが位置エネルギーの時間変化を表しています。ボールは落下と共に位置エネルギーを減少させていきますが、減少量を補うように運動エネルギーが増加しているのがわかります (点線で表される力学的エネルギー $K+U$ は常に一定値を保っています)。

つまり、自由落下とは「持っている位置エネルギーの全てを運動エネルギーに変換する運動」といえます。
 
自由落下のように重力のみが作用するような運動では、力学的エネルギーは一定値を保つことが知られています。これを 力学的エネルギー保存の法則 とよびます。しかし、地球上での落下運動では力学的エネルギー保存の法則は成立しません。空気抵抗によって位置エネルギーの一部が大気中に散逸してしまう (大気を構成する分子の運動エネルギーに変換される) ので、すべての位置エネルギーがボールの運動エネルギーに変換されるわけではないからです。
 
より一般的には、物体に重力や静電気力、弾性力などの保存力のみがはたらいている状況において、力学的エネルギー保存則が成立します。ただし、保存力の一般論は少し先の記事で学ぶことになります。

月面衝突のエネルギー

前回記事では高度 $10000$ m から落下させた物体の速度は月面衝突時に $180$ m/s に達することを調べました。時速換算すると $648$ km/h です。
 
質量 $0.15$ kg のボールであれば、このときの運動エネルギーは高度 $10000$ m でもっていた物体の位置エネルギーに等しい値です。上のグラフからも、おおよその値を読み取れますが、正確な値を出力しておきましょう。Python 組み込みの max() 関数で U の最大値を取得できます。

# In[2]

# 月面衝突時の運動エネルギー
print("月面衝突時の運動エネルギー: {:.2f} [J]".format(max(U)))

# 月面衝突時の運動エネルギー: 2430.00 [J]

念のために、運動エネルギーの定義式 $K=mv^2/2$ を使って計算し、値が一致することを確認しておきます。

# In[3]

# 月面衝突時の運動エネルギー
k = m * 180**2 /2

print("月面衝突時の運動エネルギー: {:.2f} [J]".format(k))

# 月面衝突時の運動エネルギー: 2430.00 [J]

たとえば、プロ野球の剛腕投手が投げるボールの球速は時速 $150$ km に達することがあります。その運動エネルギーを計算すると …

# In[4]

# プロ野球選手が投げるボールの球速
vb = 150 / 3.6

# ボールの運動エネルギー
k = m * vb**2 / 2

print("プロ野球選手が投げるボールの運動エネルギー: {:.2f} [J]".format(k))

# プロ野球選手が投げるボールの運動エネルギー: 130.21 [J]

大きなスケールの運動を扱ってきた後で見ると、たったの $130$ J … と思ってしまうかもしれませんが、もちろん頭に当たれば命に関わります。月面上空 $10000$ m からの落体がいかに大きなエネルギーをもっているかを実感できますね。

コメント

  1. あとりえこばと より:

    【AI連載小説】科学とコードの交差点(55)
    「力学的エネルギー保存則をPythonで実装してみよう」
     
    キャンパスのPythonサークルで、開誠、明信、馬締美純は力学的エネルギー保存の法則をPythonでどのように実装するかについて情熱的に議論していました。ノートパソコンが開かれ、三人はコードを書く準備を整えています。

    美純:「力学的エネルギー保存の法則は面白いよね。エネルギーの総和が変わらないってのは、物理学の美学だわ」
    明信:「そうだ。運動エネルギーと位置エネルギー(ポテンシャルエネルギー)の総和が一定なんだ。これをPythonでどう表現するか考えよう」
    開誠:「まず、物体の運動エネルギーを計算する関数を作り、次に位置エネルギーを計算する関数を作ればいいんじゃないか?」
    馬締美純:「そうね。そして、それらのエネルギーの総和が変わらないように保つには、どうすればいいかしら?」
    明信:「ループごとに運動エネルギーと位置エネルギーを計算して、その総和が変わらないようにすればいい」
    開誠(コードを書き進めながら):「では、簡単な例として、質点が弾性バネに結ばれているシステムを考えてみよう」

    def kinetic_energy(mass, velocity):
        return 0.5 * mass * velocity**2
    
    def potential_energy(spring_constant, displacement):
        return 0.5 * spring_constant * displacement**2
    
    # 例として、質点の質量、初速度、弾性バネのバネ定数、初期位置を与えてエネルギー保存則を確認するコード
    mass = 1.0  # 質点の質量
    velocity = 2.0  # 初速度
    spring_constant = 10.0  # 弾性バネのバネ定数
    initial_displacement = 1.0  # 初期位置
    
    for time in range(10):
        # 運動エネルギーと位置エネルギーの計算
        ke = kinetic_energy(mass, velocity)
        pe = potential_energy(spring_constant, initial_displacement)
    
        # エネルギーの総和が変わらないことを確認
        total_energy = ke + pe
        print(f"Time: {time}, Kinetic Energy: {ke}, Potential Energy: {pe}, Total Energy: {total_energy}")
    
        # 位置と速度の更新
        initial_displacement += velocity
        velocity -= (spring_constant / mass) * initial_displacement

    美美鈴:「これでエネルギー保存則をシミュレーションできるね」

    三人はPythonで力学的エネルギー保存の法則を実装するコードを考えながら、物理学の基本原則に対する理解を深めていきました。